共计 28313 个字符,预计需要花费 71 分钟才能阅读完成。
部署环境
此次部署 kubernetes1.8.3
版本使用两台机器进行操作,一台做为 Master
节点,一台作为 Node
节点。部署流程及配置与正式环境下是一致的。
Kubernetes Master 节点:10.0.11.222
Kubernetes Node 节点:10.0.11.221
部署软件
CentOS:CentOS 7.3
Docker:17.03.2-ce
Kubernetes:1.8.3
etcd:3.2.7
flannel:v0.7.1
准备工作
master
节点、node
节点都要做这些准备工作。
关闭防火墙
[ | ]|
[ | ]
禁用 selinux
# 设置 selinux 为关闭 | |
[root@mimo222 ~]# setenforce 0 | |
# 打开 selinux 配置文件 | |
[root@mimo222 ~]# vim /etc/selinux/config | |
# SELINUX 配置项修改为 disabled | |
SELINUX=disabled |
创建验证
此次安装 kubernetes1.8.3
,我们使用基于CA 签名
的数字证书认证方式,通过 cfssl
进行证书生成。此次安装是 单 Master 节点
,因此证书的生成都在Master
节点完成。如果你安装的是 多 Master 节点
,那么可在其中一个Master
节点生成证书,然后同步将证书拷贝到其他的 Master
(注意:多个Master
节点的证书目录一定要一致,以避免不必要的问题出现)。最后,在配置 Node
节点时,我们可以从 Master
节点拷贝 Node
节点需要的证书。
安装 cfssl
[ | ]|
[ | ]|
[ | ]|
[ | ]|
[ | ]|
[ | ]|
[ | ]|
[ | ]|
[ | ]
安装 cfssl
需要下载上面命令中的三个文件,如果通过 wget
无法下载,可通过直接在网页上访问该链接下载,然后拷贝到 /opt/local/cfssl
目录。注意修改文件权限。
创建 CA 证书配置
创建 ssl
目录:
[ | ]|
[ | ]
在 /opt/ssl
目录下创建 config.json
文件:
vi config.json | |
{"signing": {"default": {"expiry": "87600h" | |
}, | |
"profiles": {"kubernetes": {"usages": ["signing", | |
"key encipherment", | |
"server auth", | |
"client auth" | |
], | |
"expiry": "87600h" | |
} | |
} | |
} | |
} |
在 /opt/ssl
目录下创建csr.json
文件:
vi csr.json | |
{"CN": "kubernetes", | |
"key": {"algo": "rsa", | |
"size": 2048 | |
}, | |
"names": [ | |
{"C": "CN", | |
"ST": "ShenZhen", | |
"L": "ShenZhen", | |
"O": "k8s", | |
"OU": "System" | |
} | |
] | |
} |
生成 CA 证书和私钥
[root@mimo222 ~]# cd /opt/ssl/ | |
# 生成 CA 证书和私钥 | |
[root@mimo222 ~]# /opt/local/cfssl/cfssl gencert -initca csr.json | /opt/local/cfssl/cfssljson -bare ca | |
[root@mimo222 ~]# ls -lt | |
total 5 | |
-rw-r--r-- 1 root root 1005 Dec 14 17:48 ca.csr | |
-rw------- 1 root root 1679 Dec 14 17:48 ca-key.pem | |
-rw-r--r-- 1 root root 1363 Dec 14 17:48 ca.pem | |
-rw-r--r--. 1 root root 292 Dec 14 17:45 config.json | |
-rw-r--r-- 1 root root 210 Dec 14 17:48 csr.json |
分发证书
我们将所有 kubernetes
相关的证书都保存到 /etc/kubernetes/ssl
目录,方便管理。
[ | ]|
[ | ]|
[ | ]|
[ | ]|
[ | ]
安装 Docker
所有 kubernetes
节点都需要安装docker
,并且版本最好一致。
开始安装
# 删除老版本 Docker 及依赖,如果机器上装过其他版本的 docker,可通过该命令进行老版本 docker 清理 | |
[root@mimo222 ~]# yum remove docker docker-common container-selinux docker-selinux docker-engine | |
# 安装 yum-config-manager | |
[root@mimo222 ~]# yum -y install yum-utils | |
# 导入 yum 源 | |
[root@mimo222 ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo | |
# 更新 repo | |
[root@mimo222 ~]# yum makecache | |
# 查看 yum 版本 | |
[root@mimo222 ~]# yum list docker-ce.x86_64 --showduplicates |sort -r | |
# 安装指定版本 docker-ce 17.03 被 docker-ce-selinux 依赖, 不能直接 yum 安装 docker-ce-selinux | |
# 如果此处通过 wget 无法下载,可到网上查一下这个 rpm 包,下载下来然后拷贝到服务器���。 | |
[root@mimo222 ~]# wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm | |
[root@mimo222 ~]# rpm -ivh docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm | |
# 安装 docker | |
[root@mimo222 ~]# yum -y install docker-ce-17.03.2.ce |
查看 docker 版本
[root@mimo222 ~]# docker version | |
Client: | |
Version: 17.03.2-ce | |
API version: 1.27 | |
Go version: go1.7.5 | |
Git commit: f5ec1e2 | |
Built: Tue Jun 27 02:21:36 2017 | |
OS/Arch: linux/amd64 | |
Server: | |
Version: 17.03.2-ce | |
API version: 1.27 (minimum version 1.12) | |
Go version: go1.7.5 | |
Git commit: f5ec1e2 | |
Built: Tue Jun 27 02:21:36 2017 | |
OS/Arch: linux/amd64 | |
Experimental: false |
更改 docker 配置
更改 /usr/lib/systemd/system/docker.service
启动文件
[root@mimo222 ~]# vi /usr/lib/systemd/system/docker.service | |
[Unit] | |
Description=Docker Application Container Engine | |
Documentation=https://docs.docker.com | |
After=network-online.target firewalld.service | |
Wants=network-online.target | |
[Service] | |
Type=notify | |
ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS $DOCKER_OPTS $DOCKER_DNS_OPTIONS | |
ExecReload=/bin/kill -s HUP $MAINPID | |
LimitNOFILE=infinity | |
LimitNPROC=infinity | |
LimitCORE=infinity | |
TimeoutStartSec=0 | |
Delegate=yes | |
KillMode=process | |
Restart=on-failure | |
StartLimitBurst=3 | |
StartLimitInterval=60s | |
[Install] | |
WantedBy=multi-user.target |
对比初始安装 docker
后的 docker.service
文件内容,修改 docker.service
文件。
修改其他配置
[root@mimo222 ~]# mkdir -p /usr/lib/systemd/system/docker.service.d/
docker-options.conf
该文件中保存 docker
启动的一些参数
[root@mimo222 ~]# vi /usr/lib/systemd/system/docker.service.d/docker-options.conf | |
# 文件中添加信息如下:(注意 Environment 配置信息必须在同一行,如果出现换行会无法加载) | |
[Service] | |
Environment="DOCKER_OPTS=--insecure-registry=10.254.0.0/16 --graph=/opt/docker --disable-legacy-registry" |
[root@mimo222 ~]# vi /usr/lib/systemd/system/docker.service.d/docker-dns.conf | |
# 添加如下 : | |
[Service] | |
Environment="DOCKER_DNS_OPTIONS=\ | |
--dns 10.254.0.2 --dns 114.114.114.114 \ | |
--dns-search default.svc.cluster.local --dns-search svc.cluster.local \ | |
--dns-opt ndots:2 --dns-opt timeout:2 --dns-opt attempts:2" |
flannel.conf
:该文件保存了读取 flannel
网络分段信息
# 1. 该配置文件用于和 flannel 网络交互,若使用的网络配置不是 flannel,则无需该配置文件 | |
# 2. 该配置文件需在 flannel 安装配置之后才能生效 | |
vi /usr/lib/systemd/system/docker.service.d/flannel.conf | |
添加如下信息:[Service] | |
EnvironmentFile=-/run/flannel/docker |
启动、重启、查看docker
[ | ]|
[ | ]|
[ | ]|
[ | ]|
[ | ]|
[ | ]
etcd 安装配置
etcd
是 kubernetes
集群最重要的组件,etcd
挂了,集群就挂了。
安装 etcd
这里我是在别的地方下载了etcd-3.2.9-3.el7.x86_64.rpm
,然后拷贝到服务器上进行安装。
rpm -ivh etcd-3.2.9-3.el7.x86_64.rpm
创建 etcd 证书
[ | ]|
[ | ]|
{"CN": "etcd", | |
"hosts": ["127.0.0.1", | |
"10.0.11.222" | |
], | |
"key": {"algo": "rsa", | |
"size": 2048 | |
}, | |
"names": [ | |
{"C": "CN", | |
"ST": "TianJin", | |
"L": "TianJin", | |
"O": "k8s", | |
"OU": "System" | |
} | |
] | |
} |
其中,hosts
中填写的是 etcd 节点的地址,这里只安装了单节点 etcd
,因此只填写了etcd
本地地址 127.0.0.1
以及 10.0.11.222
。如果安装的是etcd
集群,则需要在 hosts
中添加别的 etcd
节点的 ip
地址。
# 生成 etcd 密钥 | |
/opt/local/cfssl/cfssl gencert -ca=/opt/ssl/ca.pem \ | |
-ca-key=/opt/ssl/ca-key.pem \ | |
-config=/opt/ssl/config.json \ | |
-profile=kubernetes etcd-csr.json | /opt/local/cfssl/cfssljson -bare etcd |
/opt/local/cfssl/cfssl
:使用 cfssl 进行证书生成
[ | ]|
-rw-r--r-- 1 root root 1050 Dec 14 18:31 etcd.csr | |
-rw-r--r-- 1 root root 257 Dec 14 18:31 etcd-csr.json | |
-rw------- 1 root root 1679 Dec 14 18:31 etcd-key.pem | |
-rw-r--r-- 1 root root 1424 Dec 14 18:31 etcd.pem | |
[ | ]|
[ | ]
修改 etcd 配置
修改 etcd
配置文件/etc/etcd/etcd.conf
# 备份原来的 etcd.conf 配置文件 | |
mv /etc/etcd/etcd.conf /etc/etcd/etcd.conf-bak | |
# 重新写一份配置文件 | |
vi /etc/etcd/etcd.conf | |
# [member] | |
ETCD_NAME=etcd1 # etcd 节点名称 | |
ETCD_DATA_DIR="/var/lib/etcd/etcd1.etcd" | |
ETCD_WAL_DIR="/var/lib/etcd/wal" | |
ETCD_SNAPSHOT_COUNT="100" | |
ETCD_HEARTBEAT_INTERVAL="100" | |
ETCD_ELECTION_TIMEOUT="1000" | |
ETCD_LISTEN_PEER_URLS="https://[Node IP]:2380" | |
ETCD_LISTEN_CLIENT_URLS="https://[Node IP]:2379,http://127.0.0.1:2379" | |
ETCD_MAX_SNAPSHOTS="5" | |
ETCD_MAX_WALS="5" | |
#ETCD_CORS="" | |
# [cluster] | |
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://[Node IP]:2380" | |
# if you use different ETCD_NAME (e.g. test), set ETCD_INITIAL_CLUSTER value for this name, i.e. "test=http://..." | |
ETCD_INITIAL_CLUSTER="etcd1=https://[Node IP]:2380" | |
ETCD_INITIAL_CLUSTER_STATE="new" | |
ETCD_INITIAL_CLUSTER_TOKEN="k8s-etcd-cluster" | |
ETCD_ADVERTISE_CLIENT_URLS="https://[Node IP]:2379" | |
#ETCD_DISCOVERY="" | |
#ETCD_DISCOVERY_SRV="" | |
#ETCD_DISCOVERY_FALLBACK="proxy" | |
#ETCD_DISCOVERY_PROXY="" | |
#ETCD_STRICT_RECONFIG_CHECK="false" | |
#ETCD_AUTO_COMPACTION_RETENTION="0" | |
# [proxy] | |
#ETCD_PROXY="off" | |
#ETCD_PROXY_FAILURE_WAIT="5000" | |
#ETCD_PROXY_REFRESH_INTERVAL="30000" | |
#ETCD_PROXY_DIAL_TIMEOUT="1000" | |
#ETCD_PROXY_WRITE_TIMEOUT="5000" | |
#ETCD_PROXY_READ_TIMEOUT="0" | |
# [security] | |
ETCD_CERT_FILE="/etc/kubernetes/ssl/etcd.pem" | |
ETCD_KEY_FILE="/etc/kubernetes/ssl/etcd-key.pem" | |
ETCD_CLIENT_CERT_AUTH="true" | |
ETCD_TRUSTED_CA_FILE="/etc/kubernetes/ssl/ca.pem" | |
ETCD_AUTO_TLS="true" | |
ETCD_PEER_CERT_FILE="/etc/kubernetes/ssl/etcd.pem" | |
ETCD_PEER_KEY_FILE="/etc/kubernetes/ssl/etcd-key.pem" | |
ETCD_PEER_CLIENT_CERT_AUTH="true" | |
ETCD_PEER_TRUSTED_CA_FILE="/etc/kubernetes/ssl/ca.pem" | |
ETCD_PEER_AUTO_TLS="true" | |
# [logging] | |
#ETCD_DEBUG="false" | |
# examples for -log-package-levels etcdserver=WARNING,security=DEBUG | |
#ETCD_LOG_PACKAGE_LEVELS="" |
注意:
1、将上面的配置文件中的 [Node IP]
都修改为本机 IP,这里我安装在 10.0.11.222,因此都修改成了 10.0.11.222。
2、[security]
下的配置项指定了证书的位置,因此要注意证书的位置是否正确。
3、如果安装的是 etcd 集群,配置文件信息基本一致,只要修改 [Node IP]
为 etcd 节点的主机 IP 即可,同时修改 ETCD_INITIAL_CLUSTER
项,该项需要添加所有 etcd 节点,例如:ETCD_INITIAL_CLUSTER="etcd1=https://172.16.1.64:2380,etcd2=https://172.16.1.65:2380,etcd3=https://172.16.1.66:2380"
。
启动 etcd
[ | ]|
[ | ]|
[ | ]|
journalctl -f -t etcd 和 journalctl -u etcd 来定位问题 | |
[ | ]
验证 etcd 状态
查看 etcd 状态
若为 etcd
集群,则 --endpoints
需要填写所有 etcd
节点IP:PORT
etcdctl --endpoints=https://10.0.11.222:2379\ | |
--cert-file=/etc/kubernetes/ssl/etcd.pem \ | |
--ca-file=/etc/kubernetes/ssl/ca.pem \ | |
--key-file=/etc/kubernetes/ssl/etcd-key.pem \ | |
cluster-health | |
member 2012db49e3efb509 is healthy: got healthy result from https://10.0.11.222:2379 | |
cluster is healthy |
查看 etcd 集群成员
etcdctl --endpoints=https://10.0.11.222:2379\ | |
--cert-file=/etc/kubernetes/ssl/etcd.pem \ | |
--ca-file=/etc/kubernetes/ssl/ca.pem \ | |
--key-file=/etc/kubernetes/ssl/etcd-key.pem \ | |
member list | |
2012db49e3efb509: name=etcd1 peerURLs=http://10.0.11.222:2380 clientURLs=https://10.0.11.222:2379 isLeader=true |
Kubernetes Master 节点安装配置
Master
需要部署 kube-apiserver
, kube-scheduler
, kube-controller-manager
这三个组件。kube-scheduler
作用是调度 pods
分配到那个 node
里,简单来说就是资源调度。kube-controller-manager
作用是 对 deployment controller
, replication controller
, endpoints controller
, namespace controller
and serviceaccounts controller
等等的循环控制,与 kube-apiserver
交互。
安装组件
[ | ]|
[ | ]|
[ | ]|
[ | ]|
[ | ]|
[ | ]
创建 admin 证书
kubectl
与 kube-apiserver
的安全端口通信,需要为安全通信提供 TLS
证书和秘钥。
[ | ]|
[ | ]|
{"CN": "admin", | |
"hosts": [], | |
"key": {"algo": "rsa", | |
"size": 2048 | |
}, | |
"names": [ | |
{"C": "CN", | |
"ST": "TianJin", | |
"L": "TianJin", | |
"O": "system:masters", | |
"OU": "System" | |
} | |
] | |
} |
生成admin
证书和私钥
[root@mimo222 ~]# cd /opt/ssl/ | |
/opt/local/cfssl/cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem \ | |
-ca-key=/etc/kubernetes/ssl/ca-key.pem \ | |
-config=/opt/ssl/config.json \ | |
-profile=kubernetes admin-csr.json | /opt/local/cfssl/cfssljson -bare admin |
查看生成
[root@mimo222 ssl]# ll admin* | |
-rw-r--r-- 1 root root 1013 Dec 14 19:22 admin.csr | |
-rw-r--r-- 1 root root 231 Dec 14 19:22 admin-csr.json | |
-rw------- 1 root root 1679 Dec 14 19:22 admin-key.pem | |
-rw-r--r-- 1 root root 1407 Dec 14 19:22 admin.pem |
拷贝到指定目录
cp admin*.pem /etc/kubernetes/ssl/
配置 kubectl kubeconfig 文件
生成证书相关的配置文件存储与 /root/.kube
目录中
# 配置 kubernetes 集群 | |
kubectl config set-cluster kubernetes \ | |
--certificate-authority=/etc/kubernetes/ssl/ca.pem \ | |
--embed-certs=true \ | |
--server=https://127.0.0.1:6443 | |
# 配置 客户端认证 | |
kubectl config set-credentials admin \ | |
--client-certificate=/etc/kubernetes/ssl/admin.pem \ | |
--embed-certs=true \ | |
--client-key=/etc/kubernetes/ssl/admin-key.pem | |
kubectl config set-context kubernetes \ | |
--cluster=kubernetes \ | |
--user=admin | |
kubectl config use-context kubernetes |
创建 kubernetes 证书
[ | ]|
[ | ]|
{"CN": "kubernetes", | |
"hosts": ["127.0.0.1", | |
"10.0.11.222", | |
"10.254.0.1", | |
"kubernetes", | |
"kubernetes.default", | |
"kubernetes.default.svc", | |
"kubernetes.default.svc.cluster", | |
"kubernetes.default.svc.cluster.local" | |
], | |
"key": {"algo": "rsa", | |
"size": 2048 | |
}, | |
"names": [ | |
{"C": "CN", | |
"ST": "ShenZhen", | |
"L": "ShenZhen", | |
"O": "k8s", | |
"OU": "System" | |
} | |
] | |
} |
这里 hosts
字段中三个 IP 分别为 127.0.0.1
本机、172.16.1.64
为 Master
的 IP
(多个Master
节点需要将所有 master
节点 IP
都写在这)、10.254.0.1
为 kubernetes SVC
的 IP
,一般是部署网络的第一个IP
, 如: 10.254.0.1
,在启动完成后,我们使用 kubectl get svc
,就可以查看到。
生成 kubernetes 证书和私钥
kubelet
首次启动时向 kube-apiserver
发送 TLS Bootstrapping
请求,kube-apiserver
验证 kubelet
请求中的 token
是否与它配置的 token
一致,如果一致则自动为 kubelet
生成证书和秘钥。
[ | ]|
3140a1541451afcc87ca7b715f124ce3 | |
[ | ]|
[ | ]|
3140a1541451afcc87ca7b715f124ce3,kubelet-bootstrap,10001,"system:kubelet-bootstrap" | |
cp token.csv /etc/kubernetes/ |
# 生成高级审核配置文件 | |
[root@mimo222 ~]# cd /etc/kubernetes | |
cat >> audit-policy.yaml <<EOF | |
# Log all requests at the Metadata level. | |
apiVersion: audit.k8s.io/v1beta1 | |
kind: Policy | |
rules: | |
- level: Metadata | |
EOF |
创建 kube-apiserver.service 文件
- 自定义 系统 service 文件一般存于
/etc/systemd/system/
下 - 配置为 各自的本地
IP
[root@mimo222 ~]# vi /etc/systemd/system/kube-apiserver.service | |
[Unit] | |
Description=Kubernetes API Server | |
Documentation=https://github.com/GoogleCloudPlatform/kubernetes | |
After=network.target | |
[Service] | |
User=root | |
ExecStart=/usr/local/bin/kube-apiserver \ | |
--admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota,NodeRestriction \ | |
--advertise-address=10.0.11.222 \ | |
--allow-privileged=true \ | |
--apiserver-count=3 \ | |
--audit-policy-file=/etc/kubernetes/audit-policy.yaml \ | |
--audit-log-maxage=30 \ | |
--audit-log-maxbackup=3 \ | |
--audit-log-maxsize=100 \ | |
--audit-log-path=/var/log/kubernetes/audit.log \ | |
--authorization-mode=Node,RBAC \ | |
--anonymous-auth=false \ # 不接受匿名访问,若为 true,则表示接受,此处设置为 false,便于 dashboard 访问 | |
--bind-address=0.0.0.0 \ | |
--secure-port=6443 \ | |
--client-ca-file=/etc/kubernetes/ssl/ca.pem \ | |
--enable-swagger-ui=true \ | |
--etcd-cafile=/etc/kubernetes/ssl/ca.pem \ | |
--etcd-certfile=/etc/kubernetes/ssl/etcd.pem \ | |
--etcd-keyfile=/etc/kubernetes/ssl/etcd-key.pem \ | |
--etcd-servers=https://10.0.11.222:2379 \ | |
--event-ttl=1h \ | |
--kubelet-https=true \ | |
--insecure-bind-address=127.0.0.1 \ | |
--insecure-port=8080 \ | |
--service-account-key-file=/etc/kubernetes/ssl/ca-key.pem \ | |
--service-cluster-ip-range=10.254.0.0/16 \ | |
--service-node-port-range=30000-32000 \ | |
--tls-cert-file=/etc/kubernetes/ssl/kubernetes.pem \ | |
--tls-private-key-file=/etc/kubernetes/ssl/kubernetes-key.pem \ | |
--enable-bootstrap-token-auth \ | |
--token-auth-file=/etc/kubernetes/token.csv \ | |
--v=2 | |
Restart=on-failure | |
RestartSec=5 | |
Type=notify | |
LimitNOFILE=65536 | |
[Install] | |
WantedBy=multi-user.target |
-
--advertise-address
:master 节点本机 IP -
--etcd-servers:etcd URL
:etcd 集群需要写上所有 etcd 节点 URL -
--service-node-port-range=30000-32000
:这个地方是 映射外部端口时 的端口范围,随机映射也在这个范围内映射,指定映射端口必须也在这个范围内。 -
注意验证证书等路径是否正确。
启动 kube-apiserver
[ | ]|
[ | ]|
[ | ]|
[ | ]
配置 kube-controller-manager
创建 kube-controller-manager.service
文件
[root@mimo222 ~]# vi /etc/systemd/system/kube-controller-manager.service | |
[Unit] | |
Description=Kubernetes Controller Manager | |
Documentation=https://github.com/GoogleCloudPlatform/kubernetes | |
[Service] | |
ExecStart=/usr/local/bin/kube-controller-manager \ | |
--address=0.0.0.0 \ | |
--master=http://127.0.0.1:8080 \ | |
--allocate-node-cidrs=true \ | |
--service-cluster-ip-range=10.254.0.0/16 \ | |
--cluster-cidr=10.233.0.0/16 \ | |
--cluster-name=kubernetes \ | |
--cluster-signing-cert-file=/etc/kubernetes/ssl/ca.pem \ | |
--cluster-signing-key-file=/etc/kubernetes/ssl/ca-key.pem \ | |
--service-account-private-key-file=/etc/kubernetes/ssl/ca-key.pem \ | |
--root-ca-file=/etc/kubernetes/ssl/ca.pem \ | |
--leader-elect=true \ | |
--v=2 | |
Restart=on-failure | |
RestartSec=5 | |
[Install] | |
WantedBy=multi-user.target |
启动 kube-controller-manager
[ | ]|
[ | ]|
[ | ]|
[ | ]
配置 kube-scheduler
创建 kube-cheduler.service
文件
[root@mimo222 ~]# vi /etc/systemd/system/kube-scheduler.service | |
[Unit] | |
Description=Kubernetes Scheduler | |
Documentation=https://github.com/GoogleCloudPlatform/kubernetes | |
[Service] | |
ExecStart=/usr/local/bin/kube-scheduler \ | |
--address=0.0.0.0 \ | |
--master=http://127.0.0.1:8080 \ | |
--leader-elect=true \ | |
--v=2 | |
Restart=on-failure | |
RestartSec=5 | |
[Install] | |
WantedBy=multi-user.target |
启动 kube-scheduler
[ | ]|
[ | ]|
[ | ]|
[ | ]
验证 Master 节点
[ | ]|
NAME STATUS MESSAGE ERROR | |
scheduler Healthy ok | |
controller-manager Healthy ok | |
etcd-0 Healthy {"health": "true"} | |
[ | ]|
NAME STATUS ROLES AGE VERSION |
flannel 安装配置
kubernetes
要求集群内各节点能通过 Pod
网段互联互通,本节介绍使用 Flannel
在所有节点 (Master、Node)
上创建互联互通的 Pod
网段的步骤。
创建 flannel 证书
[ | ]|
[ | ]|
{"CN": "flanneld", | |
"hosts": [], | |
"key": {"algo": "rsa", | |
"size": 2048 | |
}, | |
"names": [ | |
{"C": "CN", | |
"ST": "ShenZhen", | |
"L": "ShenZhen", | |
"O": "k8s", | |
"OU": "System" | |
} | |
] | |
} |
注意:hosts 字段为空。
生成 flanneld 证书和私钥
[root@mimo222 ~]# cd /opt/ssl | |
[root@mimo222 ~]# /opt/local/cfssl/cfssl gencert -ca=/opt/ssl/ca.pem \ | |
-ca-key=/opt/ssl/ca-key.pem \ | |
-config=/opt/ssl/config.json \ | |
-profile=kubernetes flanneld-csr.json | /opt/local/cfssl/cfssljson -bare flanneld |
# 查看生成信息 | |
[root@mimo222 ~]# ll flannel* | |
-rw-r--r-- 1 root root 1001 Dec 15 13:59 flanneld.csr | |
-rw-r--r-- 1 root root 223 Dec 15 13:56 flanneld-csr.json | |
-rw------- 1 root root 1679 Dec 15 13:59 flanneld-key.pem | |
-rw-r--r-- 1 root root 1395 Dec 15 13:59 flanneld.pem | |
# 拷贝 | |
[root@mimo222 ~]# cp flanneld*.pem /etc/kubernetes/ssl/ |
向 etcd 写入集群 Pod 网段信息
注意:本步骤只需在第一次部署 Flannel 网络时执行,后续在其它节点上部署 Flannel 时无需再写入该信息!
etcdctl --endpoints=https://10.0.11.222:2379 \ | |
--ca-file=/opt/ssl/ca.pem \ | |
--cert-file=/etc/kubernetes/ssl/flanneld.pem \ | |
--key-file=/etc/kubernetes/ssl/flanneld-key.pem \ | |
set /kubernetes/network/config '{"Network":"10.233.0.0/16"}' |
写入的 Pod
网段({"Network":"10.233.0.0/16"}
) 必须与 kube-controller-manager
的 --cluster-cidr
选项值一致;
安装和配置 flanneld
下载 flanneld
[ | ]|
[ | ]|
[ | ]|
[ | ]|
[ | ]
创建启动文件 flanneld.service
[root@mimo222 ~]# vi /etc/systemd/system/flanneld.service | |
# 添加以下信息: | |
[Unit] | |
Description=Flanneld overlay address etcd agent | |
After=network.target | |
After=network-online.target | |
Wants=network-online.target | |
After=etcd.service | |
Before=docker.service | |
[Service] | |
Type=notify | |
ExecStart=/usr/local/bin/flanneld \\ | |
-etcd-cafile=/etc/kubernetes/ssl/ca.pem \\ | |
-etcd-certfile=/etc/flanneld/ssl/flanneld.pem \\ | |
-etcd-keyfile=/etc/flanneld/ssl/flanneld-key.pem \\ | |
-etcd-endpoints=https://10.0.11.222:2379 \\ | |
-etcd-prefix=/kubernetes/network | |
ExecStartPost=/usr/local/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker | |
Restart=on-failure | |
[Install] | |
WantedBy=multi-user.target | |
RequiredBy=docker.service |
-
-etcd-endpoints
:填写etcd
配置的URL
,注意使用https
。 -
-etcd-prefix
:上面第一步设置的Pod
网段key
前缀。我设置的key
为/kubernetes/network/config
,因此前缀为/kubernetes/network
。 -
注意 CA 验证证书的路径是否正确。
启动 flanneld
[ | ]|
[ | ]|
[ | ]|
[ | ]
etcd 中 flannel 网段信息查询
对于以下命令,--endpoints
参数后跟的是 etcd
集群 IP:PORT
(多个etcd
节点需填多个 IP:PORT
),/kubernetes/network
是我这里设置的 FLANNEL_ETCD_PREFIX
,因此大家可根据自己设置的flannel etcd 前缀
来填写。--ca-file
、--cert-file
、--key-file
是指相应 flannel 证书路径,若没有采用 CA 验证,则不需要。
下面的命令仅是我这里用的一些命令例子,其中参数需要根据自己需要修改一下。
查看 ETCD 中 flannel 集群 Pod 网段
etcdctl --endpoints=https://10.0.11.222:2379 \ | |
--ca-file=/opt/ssl/ca.pem \ | |
--cert-file=/etc/kubernetes/ssl/flanneld.pem \ | |
--key-file=/etc/kubernetes/ssl/flanneld-key.pem \ | |
get /kubernetes/network/config | |
{"Network":"10.233.0.0/16"} |
查看已分配的 Pod 子网段列表
etcdctl --endpoints=https://10.0.11.222:2379 \ | |
--ca-file=/opt/ssl/ca.pem \ | |
--cert-file=/etc/kubernetes/ssl/flanneld.pem \ | |
--key-file=/etc/kubernetes/ssl/flanneld-key.pem \ | |
ls /kubernetes/network/subnets | |
/kubernetes/network/subnets/10.233.50.0-24 | |
/kubernetes/network/subnets/10.233.86.0-24 |
查看某一 Pod 网段对应的 flanneld 进程监听的 IP 和网络参数
etcdctl --endpoints=https://10.0.11.222:2379 \ | |
--ca-file=/opt/ssl/ca.pem \ | |
--cert-file=/etc/kubernetes/ssl/flanneld.pem \ | |
--key-file=/etc/kubernetes/ssl/flanneld-key.pem \ | |
get /kubernetes/network/subnets/10.233.50.0-24 | |
{"PublicIP":"10.0.11.221"} |
确保各节点间 Pod 网段能互联互通
在各节点上部署完 Flannel 后,根据上面命令查看已分配的 Pod 子网段列表(此处是我分配的网段列表):
/kubernetes/network/subnets/10.233.50.0-24 | |
/kubernetes/network/subnets/10.233.86.0-24 |
在各节点上分配 ping 这两个网段的网关地址,确保能通:
ping 10.233.50.1 | |
ping 10.233.86.1 |
Kubernetes Node 节点安装配置
kubernetes node
节点需要安装 kubelet
、kube-proxy
、flannel
。 下面的配置步骤,指明在 master 节点执行的需要在 master 节点执行,没有指明的在 node 节点执行。
配置 kubelet(Master 节点执行)
kubelet
启动时向 kube-apiserver
发送 TLS bootstrapping
请求,需要先将 bootstrap token
文件中的 kubelet-bootstrap
用户赋予 system:node-bootstrapper
角色,然后 kubelet
才有权限创建认证请求(certificatesigningrequests)
。
# 先创建认证请求 | |
# user 为 master 中 token.csv 文件里配置的用户 | |
# 只需创建一次就可以 | |
kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap |
创建 kubelet kubeconfig 文件(Master 节点执行)
# 配置集群(server 要写 master ip 地址,不要使用 127.0.0.1 或 localhost,否则 node 节点无法识别)kubectl config set-cluster kubernetes \ | |
--certificate-authority=/etc/kubernetes/ssl/ca.pem \ | |
--embed-certs=true \ | |
--server=https://10.0.11.222:6443 \ | |
--kubeconfig=bootstrap.kubeconfig | |
# 配置客户端认证(此处的 token 使用 token.csv 中的 token)kubectl config set-credentials kubelet-bootstrap \ | |
--token=3140a1541451afcc87ca7b715f124ce3 \ | |
--kubeconfig=bootstrap.kubeconfig | |
# 配置关联 | |
kubectl config set-context default \ | |
--cluster=kubernetes \ | |
--user=kubelet-bootstrap \ | |
--kubeconfig=bootstrap.kubeconfig | |
# 配置默认关联 | |
kubectl config use-context default --kubeconfig=bootstrap.kubeconfig | |
# 拷贝生成的 bootstrap.kubeconfig 文件 | |
mv bootstrap.kubeconfig /etc/kubernetes/ |
配置 kube-proxy(Master 节点执行)
创建 kube-proxy 证书(Master 节点执行)
[ | ]|
[ | ]|
{"CN": "system:kube-proxy", | |
"hosts": [], | |
"key": {"algo": "rsa", | |
"size": 2048 | |
}, | |
"names": [ | |
{"C": "CN", | |
"ST": "TianJin", | |
"L": "TianJin", | |
"O": "k8s", | |
"OU": "System" | |
} | |
] | |
} |
生成 kube-proxy 证书和私钥(Master 节点执行)
/opt/local/cfssl/cfssl gencert -ca=/etc/kubernetes/ssl/ca.pem \ | |
-ca-key=/etc/kubernetes/ssl/ca-key.pem \ | |
-config=/opt/ssl/config.json \ | |
-profile=kubernetes kube-proxy-csr.json | /opt/local/cfssl/cfssljson -bare kube-proxy | |
# 查看生成 | |
[root@mimo222 ssl]# ll kube-proxy* | |
-rw-r--r-- 1 root root 1013 Dec 14 20:09 kube-proxy.csr | |
-rw-r--r-- 1 root root 232 Dec 14 20:09 kube-proxy-csr.json | |
-rw------- 1 root root 1679 Dec 14 20:09 kube-proxy-key.pem | |
-rw-r--r-- 1 root root 1407 Dec 14 20:09 kube-proxy.pem | |
# 拷贝到目录 | |
cp kube-proxy*.pem /etc/kubernetes/ssl/ |
创建 kube-proxy kubeconfig 文件(Master 节点执行)
# 配置集群(server 要写 master ip 地址,不要使用 127.0.0.1 或 localhost,否则 node 节点无法识别)kubectl config set-cluster kubernetes \ | |
--certificate-authority=/etc/kubernetes/ssl/ca.pem \ | |
--embed-certs=true \ | |
--server=https://10.0.11.222:6443 \ | |
--kubeconfig=kube-proxy.kubeconfig | |
# 配置客户端认证(注意证书路径)kubectl config set-credentials kube-proxy \ | |
--client-certificate=/etc/kubernetes/ssl/kube-proxy.pem \ | |
--client-key=/etc/kubernetes/ssl/kube-proxy-key.pem \ | |
--embed-certs=true \ | |
--kubeconfig=kube-proxy.kubeconfig | |
# 配置关联 | |
kubectl config set-context default \ | |
--cluster=kubernetes \ | |
--user=kube-proxy \ | |
--kubeconfig=kube-proxy.kubeconfig | |
# 配置默认关联 | |
kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig | |
# 拷贝到目录 | |
mv kube-proxy.kubeconfig /etc/kubernetes/ |
从 master 节点拷贝证书
所有需要的证书生成最好都在 master 节点进行生成,然后统一管理,node
节点需要哪些,直接从 master
拷贝即可。
[ | ]|
[ | ]|
[ | ]|
[ | ]|
[ | ]|
[ | ]|
[ | ]|
[ | ]|
[ | ]|
[ | ]
node 节点 flannel 配置
下载 flanneld
[ | ]|
[ | ]|
[ | ]|
[ | ]|
[ | ]
配置并启动 flanneld
创建启动文件flanneld.service
:
[root@mimo222 ~]# vi /etc/systemd/system/flanneld.service | |
# 添加以下信息: | |
[Unit] | |
Description=Flanneld overlay address etcd agent | |
After=network.target | |
After=network-online.target | |
Wants=network-online.target | |
After=etcd.service | |
Before=docker.service | |
[Service] | |
Type=notify | |
ExecStart=/usr/local/bin/flanneld \\ | |
-etcd-cafile=/etc/kubernetes/ssl/ca.pem \\ | |
-etcd-certfile=/etc/flanneld/ssl/flanneld.pem \\ | |
-etcd-keyfile=/etc/flanneld/ssl/flanneld-key.pem \\ | |
-etcd-endpoints=https://10.0.11.222:2379 \\ | |
-etcd-prefix=/kubernetes/network | |
ExecStartPost=/usr/local/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/docker | |
Restart=on-failure | |
[Install] | |
WantedBy=multi-user.target | |
RequiredBy=docker.service |
-
-etcd-endpoints
:填写etcd
配置的URL
,注意使用https
。 -
-etcd-prefix
:上面第一步设置的Pod
网段 key 前缀。我设置的key
为/kubernetes/network/config
,因此前缀为/kubernetes/network
。 -
注意
CA
验证证书的路径是否正确。
启动 flanneld
:
[ | ]|
[ | ]|
[ | ]|
[ | ]
安装 kubelet、kube-proxy
[ | ]|
[ | ]|
[ | ]|
[ | ]|
[ | ]
配置 kubelet.service 文件
[root@mimo222 ~]# mkdir /var/lib/kubelet | |
[root@mimo222 ~]# vi /etc/systemd/system/kubelet.service | |
[Unit] | |
Description=Kubernetes Kubelet | |
Documentation=https://github.com/GoogleCloudPlatform/kubernetes | |
After=docker.service | |
Requires=docker.service | |
[Service] | |
WorkingDirectory=/var/lib/kubelet | |
ExecStart=/usr/local/bin/kubelet \ | |
--cgroup-driver=cgroupfs \ | |
--address=10.0.11.221 \ | |
--hostname-override=10.0.11.221 \ | |
--pod-infra-container-image=jicki/pause-amd64:3.0 \ | |
--experimental-bootstrap-kubeconfig=/etc/kubernetes/bootstrap.kubeconfig \ | |
--kubeconfig=/etc/kubernetes/kubelet.kubeconfig \ | |
--cert-dir=/etc/kubernetes/ssl \ | |
--cluster_dns=10.254.0.2 \ | |
--cluster_domain=cluster.local. \ | |
--hairpin-mode promiscuous-bridge \ | |
--allow-privileged=true \ | |
--fail-swap-on=false \ | |
--serialize-image-pulls=false \ | |
--logtostderr=true \ | |
--max-pods=512 \ | |
--v=2 | |
[Install] | |
WantedBy=multi-user.target |
-
--pod-infra-container-image
:该项配置的是 pod 启动时需要一块启动的pod-infrastructure
镜像,真实使用时最好将该文件下载到本地私有库,然后将该项配置成私有库的pod-infrastructure
镜像下载地址。 -
--kubeconfig
:kubelet
启动成功之后自动生成的kubelet.kubeconfig
文件保存路径。
启动 kubelet
[ | ]|
[ | ]|
[ | ]|
[ | ]|
journalctl -f -t kubelet 和 journalctl -u kubelet 来定位问题 |
配置 TLS 认证(Master 节点执行)
[ | ]|
NAME AGE REQUESTOR CONDITION | |
node-csr-A9WKNWyqyq89XOwg-uqCu2C4fBQEhOhzmlQJ6f8VPWE 22h kubelet-bootstrap Approved,Issued | |
node-csr-J1W94p6S2w0fjTkvpdfG0J-lRY-dmkVFH01OG3R6T4Y 3h kubelet-bootstrap Approved,Issued | |
node-csr-aVIfz5k6GX5jy31z43ZkhxzzLfkFtMUoAkJTi1Okcx8 3h kubelet-bootstrap Pending | |
kubectl get csr | grep Pending | awk '{print $1}' | xargs kubectl certificate approve |
验证 nodes(Master 节点执行)
kubectl get nodes | |
NAME STATUS ROLES AGE VERSION | |
8.3 | 3h v1.
node 节点验证
kubelet
启动成功之后,会请求 apiserver
,通过验证,node
节点本地机器会自动生成配置文件与密钥,查看/etc/kubernetes
[root@mimo221 kubernetes]# ll | |
-rw-------. 1 root root 2195 Dec 15 10:27 bootstrap.kubeconfig | |
-rw-------. 1 root root 2286 Dec 15 15:43 kubelet.kubeconfig | |
-rw-------. 1 root root 6305 Dec 15 10:28 kube-proxy.kubeconfig | |
drwxr-xr-x. 2 root root 202 Dec 15 15:43 ssl | |
[root@mimo221 kubernetes]# ll ssl |grep kubelet | |
-rw-r--r--. 1 root root 1046 Dec 15 15:43 kubelet-client.crt | |
-rw-------. 1 root root 227 Dec 15 15:38 kubelet-client.key | |
-rw-r--r--. 1 root root 1111 Dec 15 15:38 kubelet.crt | |
-rw-------. 1 root root 1675 Dec 15 15:38 kubelet.key |
配置 kube-proxy.service 文件
[root@mimo221 kubernetes]# mkdir -p /var/lib/kube-proxy | |
[root@mimo221 kubernetes]# vi /etc/systemd/system/kube-proxy.service | |
[Unit] | |
Description=Kubernetes Kube-Proxy Server | |
Documentation=https://github.com/GoogleCloudPlatform/kubernetes | |
After=network.target | |
[Service] | |
WorkingDirectory=/var/lib/kube-proxy | |
ExecStart=/usr/local/bin/kube-proxy \ | |
--bind-address=10.0.11.222 \ | |
--hostname-override=k8s-master-64 \ | |
--cluster-cidr=10.254.0.0/16 \ | |
--kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig \ | |
--logtostderr=true \ | |
--v=2 | |
Restart=on-failure | |
RestartSec=5 | |
LimitNOFILE=65536 | |
[Install] | |
WantedBy=multi-user.target |
启动 kube-proxy
[ | ]|
[ | ]|
[ | ]|
[ | ]|
journalctl -f -t kube-proxy 和 journalctl -u kube-proxy 来定位问题 |
到此如果都没有报错的话,说明 kubernetes1.8.3
集群安装成功了。
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-12/149574.htm
