一 安装和配置kubelet
1.1 关闭swap
必须关闭swap,否则kubelet启动将失败。
修改/etc/fstab将,swap系统注释掉。
1.2 吧master配置文件传到node节点
scp -r /etc/kubernetes/ [email protected]:/etc/
scp -r /etc/kubernetes/ [email protected]:/etc/
scp -r /etc/kubernetes/ [email protected]:/etc/
在master上 创建动态签署TLS bootstrap 的CSR 请求,在一台master上执行就行了。
cd /ect/kubernetes/
kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
kubelet 启动时向 kube-apiserver 发送 TLS bootstrapping 请求,需要先将 bootstrap token 文件中的 kubelet-bootstrap 用户赋予 system:node-bootstrapper cluster 角色(role), 然后 kubelet 才能有权限创建认证请求(certificate signing requests):
--user=kubelet-bootstrap
是在/etc/kubernetes/token.csv
文件中指定的用户名,同时也写入了/etc/kubernetes/bootstrap.kubeconfig
文件;
二 下载最新的kubelet和kube-proxy二进制文件
由于在master节点已经下载了kubernetes完整包。吧对应的二进制拷贝到node节点上
scp kubernetes/kubernetes/server/bin/{kube-proxy,kubelet} [email protected]:/usr/local/bin/
scp kubernetes/kubernetes/server/bin/{kube-proxy,kubelet} [email protected]:/usr/local/bin/
scp kubernetes/kubernetes/server/bin/{kube-proxy,kubelet} [email protected]:/usr/local/bin/
三 创建kubelet的service配置文件
文件位置 /usr/lib/systemd/system/kubelet.service
vim /lib/systemd/system/kubelet.service
[Unit]
Description=Kubernetes Kubelet Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=docker.service
Requires=docker.service
[Service]
WorkingDirectory=/var/lib/kubelet
EnvironmentFile=-/etc/kubernetes/config
EnvironmentFile=-/etc/kubernetes/kubelet
ExecStart=/usr/local/bin/kubelet \
$KUBE_LOGTOSTDERR \
$KUBE_LOG_LEVEL \
$KUBELET_API_SERVER \
$KUBELET_ADDRESS \
$KUBELET_PORT \
$KUBELET_HOSTNAME \
$KUBE_ALLOW_PRIV \
$KUBELET_POD_INFRA_CONTAINER \
$KUBELET_ARGS
Restart=on-failure
[Install]
WantedBy=multi-user.target
kubelet的配置文件/etc/kubernetes/kubelet。其中的IP地址更改为你的每台node节点的IP地址。
注意:在启动kubelet之前,需要先手动创建/var/lib/kubelet目录。
下面是kubelet的配置文件/etc/kubernetes/kubelet:
创建/var/lib/kubelet
mkdir /var/lib/kubelet
编辑kubelet配置文件
vim /etc/kubernetes/kubelet
###
## kubernetes kubelet (minion) config
#
## The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
#KUBELET_ADDRESS="--address=192.168.243.184"
#
## The port for the info server to serve on
#KUBELET_PORT="--port=10250"
#
## You may leave this blank to use the actual hostname
KUBELET_HOSTNAME="--hostname-override=192.168.76.30"
#
## location of the api-server
## COMMENT THIS ON KUBERNETES 1.8+
#KUBELET_API_SERVER="--api-servers=http://172.20.0.113:8080"
#
## pod infrastructure container
####KUBELET_POD_INFRA_CONTAINER="docker.io/oudi/pod-infrastructure"
#
## Add your own!
#--cgroup-driver=systemd --require-kubeconfig
#--kubeconfig=/etc/kubernetes/kubelet.kubeconfig
#KUBELET_ARGS="--cluster-dns=10.254.0.2 --bootstrap-kubeconfig=/etc/kubernetes/bootstrap.kubeconfig --kubeconfig=/etc/kubernetes/kubelet.kubeconfig --config=/etc/kubernetes/kubelet.config --cert-dir=/etc/kubernetes/ssl --cluster-domain=cluster.local --hairpin-mode promiscuous-bridge --serialize-image-pulls=false"
KUBELET_ARGS="--network-plugin=cni --bootstrap-kubeconfig=/etc/kubernetes/bootstrap.kubeconfig --kubeconfig=/etc/kubernetes/kubelet.kubeconfig --config=/etc/kubernetes/kubelet.config --cert-dir=/etc/kubernetes/ssl"
- 如果使用systemd方式启动,则需要额外增加两个参数
--runtime-cgroups=/systemd/system.slice --kubelet-cgroups=/systemd/system.slice
--experimental-bootstrap-kubeconfig
在1.9版本已经变成了--bootstrap-kubeconfig
--address
不能设置为127.0.0.1
,否则后续 Pods 访问 kubelet 的 API 接口时会失败,因为 Pods 访问的127.0.0.1
指向自己而不是 kubelet;- 如果设置了
--hostname-override
选项,则kube-proxy
也需要设置该选项,否则会出现找不到 Node 的情况; "--cgroup-driver
配置成systemd
,不要使用cgroup
,否则在 CentOS 系统中 kubelet 将启动失败(保持docker和kubelet中的cgroup driver配置一致即可,不一定非使用systemd
)。bootstrap-kubeconfig
指向 bootstrap kubeconfig 文件,kubelet 使用该文件中的用户名和 token 向 kube-apiserver 发送 TLS Bootstrapping 请求;- 管理员通过了 CSR 请求后,kubelet 自动在
--cert-dir
目录创建证书和私钥文件(kubelet-client.crt
和kubelet-client.key
),然后写入--kubeconfig
文件; --cluster-dns
指定 kubedns 的 Service IP(可以先分配,后续创建 kubedns 服务时指定该 IP),--cluster-domain
指定域名后缀,这两个参数同时指定后才会生效;--cluster-domain
指定 pod 启动时/etc/resolve.conf
文件中的search domain
,起初我们将其配置成了cluster.local.
,这样在解析 service 的 DNS 名称时是正常的,可是在解析 headless service 中的 FQDN pod name 的时候却错误,因此我们将其修改为cluster.local
,去掉嘴后面的 ”点号“ 就可以解决该问题。--kubeconfig=/etc/kubernetes/kubelet.kubeconfig
中指定的kubelet.kubeconfig
文件在第一次启动kubelet之前并不存在,请看下文,当通过CSR请求后会自动生成kubelet.kubeconfig
文件,如果你的节点上已经生成了~/.kube/config
文件,你可以将该文件拷贝到该路径下,并重命名为kubelet.kubeconfig
,所有node节点可以共用同一个kubelet.kubeconfig文件,这样新添加的节点就不需要再创建CSR请求就能自动添加到kubernetes集群中。同样,在任意能够访问到kubernetes集群的主机上使用kubectl --kubeconfig
命令操作集群时,只要使用~/.kube/config
文件就可以通过权限认证,因为这里面已经有认证信息并认为你是admin用户,对集群拥有所有权限。
新 版本需要有kubelet.config 配置文件
vim /etc/kubernetes/kubelet.config
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: 10.8.1.11
port: 10250
readOnlyPort: 10255
cgroupDriver: cgroupfs
clusterDNS: ["10.254.0.2"]
clusterDomain: cluster.local.
failSwapOn: false
authentication:
anonymous:
enabled: true
四 更改config文件下的master_api 地址
vim /etc/kubernetes/config
###
# kubernetes system config
#
# The following values are used to configure various aspects of all
# kubernetes services, including
#
# kube-apiserver.service
# kube-controller-manager.service
# kube-scheduler.service
# kubelet.service
# kube-proxy.service
# logging to stderr means we get it in the systemd journal
KUBE_LOGTOSTDERR="--logtostderr=true"
# journal message level, 0 is debug
KUBE_LOG_LEVEL="--v=0"
# Should this cluster be allowed to run privileged docker containers
KUBE_ALLOW_PRIV="--allow-privileged=true"
# How the controller-manager, scheduler, and proxy find the apiserver
#KUBE_MASTER="--master=http://sz-pg-oam-docker-test-001.tendcloud.com:8080"
#KUBE_MASTER指向VIP的6443
KUBE_MASTER="--master=https://192.168.76.250:6443"
五 启动kubelet
systemctl start kubelet
systemctl status kubelet
kubelet.service - Kubernetes Kubelet Server
Loaded: loaded (/usr/lib/systemd/system/kubelet.service; disabled; vendor preset: disabled)
Active: active (running) since Wed 2018-05-09 02:11:52 EDT; 1s ago
Docs: https://github.com/GoogleCloudPlatform/kubernetes
Main PID: 5169 (kubelet)
Tasks: 30
Memory: 25.0M
六 通过kubelet的TLS证书请求
kubelet 首次启动时向 kube-apiserver 发送证书签名请求,必须通过后 kubernetes 允许才会将该 Node 加入到集群。
查看未授权的 CSR 请求
在master节点上,任意一台
kubectl get csr
NAME AGE REQUESTOR CONDITION
node-csr-0L0zf3xm_Fqj6OMFwf-ZdanR3rp_Fgwi79yYUHrr1uk 5m kubelet-bootstrap Pending
node-csr-AB3eY8Db78vD9b4rUffGIhZTy_RvIG1y89QdcMHXjME 6m kubelet-bootstrap Pending
node-csr-CKjjCoVTyMY9kP6ZeJZY5BxNkZ4mET-BvW3OyEp7Ttk 9m kubelet-bootstrap Pending
node-csr-DiAXAdbLpT1eZ7xMTr1btQW_ehd-7bMbFwNuGt-Z8mY 10m kubelet-bootstrap Pending
node-csr-EU6CQt72OcbJ041YGZbUDOijT6qio-MFCV-e0oeA5gs 6m kubelet-bootstrap Pending
node-csr-MwOzF_e2N_Jzq_n1KHJTBUivHwKO5P0Q0uEO6cj-P7A 8m kubelet-bootstrap Pending
node-csr-T1H9ilpMrEbhUg_4JX3Sc8X1b_8kMS4TIJBnSb0hG8I 8m kubelet-bootstrap Pending
node-csr-ebdiCk_16M8oD-OeaxrEx6ZOTek-jCdB5YWfAwbvNiA 1m kubelet-bootstrap Pending
node-csr-j1FJ_ot5SmxnooY1TjGoFFTA36dnqhV5dob_AC8fZt8 3m kubelet-bootstrap Pending
node-csr-lSy_w02mCu1L9lhYZ36qjn3C3M3I-TCw7GrKYrmGka0 3m kubelet-bootstrap Pending
node-csr-pBssBdgOOM9Fa65I9yUH_nX2CGQL4OL01cmV0yc4SaQ 1m kubelet-bootstrap Pending
node-csr-pq9T7078FS-vtodhvq1RCpQjNpv7Xqk3IWuiP678mtk 44s kubelet-bootstrap Pending
node-csr-zZ8J4lXxF6pg3hJvfgJcA9Q_9vjpyzzInuJoYCSxdEY 4m kubelet-bootstrap Pending
kubectl get nodes
No resources found.
通过 CSR 请求,在任意一台master节点上
kubectl certificate approve node-csr-_SuKog5hEOThZvKYkMWEtv7S9WcSi87Ced8SoidA2
kubectl get nodes
NAME STATUS ROLES AGE VERSION
192.168.76.10 Ready <none> 3m v1.10.1
自动生成了 kubelet kubeconfig 文件和公私钥。在node节点192.168.76.10上
cd /etc/kubernetes
ls -l
-rw------- 1 root root 2289 May 9 02:24 kubelet.kubeconfig
假如你更新kubernetes的证书,只要没有更新token.csv
,当重启kubelet后,该node就会自动加入到kuberentes集群中,而不会重新发送certificaterequest
,也不需要在master节点上执行kubectl certificate approve
操作。前提是不要删除node节点上的/etc/kubernetes/ssl/kubelet*
和/etc/kubernetes/kubelet.kubeconfig
文件。否则kubelet启动时会提示找不到证书而失败。
七 配置kube-proxy
安装conntrack
yum install -y conntrack-tools
创建 kube-proxy 的service配置文件
vim /lib/systemd/system/kube-proxy.service
[Unit]
Description=Kubernetes Kube-Proxy Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=network.target
[Service]
EnvironmentFile=-/etc/kubernetes/config
EnvironmentFile=-/etc/kubernetes/proxy
ExecStart=/usr/local/bin/kube-proxy \
$KUBE_LOGTOSTDERR \
$KUBE_LOG_LEVEL \
$KUBE_MASTER \
$KUBE_PROXY_ARGS
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
kube-proxy配置文件/etc/kubernetes/proxy
vim /etc/kubernetes/proxy
###
# kubernetes proxy config
# default config should be adequate
# Add your own!
KUBE_PROXY_ARGS="--bind-address=192.168.76.10 --hostname-override=192.168.76.10 --kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig --cluster-cidr=10.254.0.0/16"
--hostname-override
参数值必须与 kubelet 的值一致,否则 kube-proxy 启动后会找不到该 Node,从而不会创建任何 iptables 规则;- kube-proxy 根据
--cluster-cidr
判断集群内部和外部流量,指定--cluster-cidr
或--masquerade-all
选项后 kube-proxy 才会对访问 Service IP 的请求做 SNAT; --kubeconfig
指定的配置文件嵌入了 kube-apiserver 的地址、用户名、证书、秘钥等请求和认证信息;- 预定义的 RoleBinding
cluster-admin
将Usersystem:kube-proxy
与 Rolesystem:node-proxier
绑定,该 Role 授予了调用kube-apiserver
Proxy 相关 API 的权限;
八 启动kube-proxy
systemctl start kube-proxy
systemctl status kube-proxy
九 其他node节点安装
scp kubelet proxy [email protected]:/etc/kubernetes/
scp kubelet proxy [email protected]:/etc/kubernetes/
scp /usr/local/bin/kube* [email protected]:/usr/local/bin/
scp /usr/local/bin/kube* [email protected]:/usr/local/bin/
scp -r /lib/systemd/system/kubelet.service kube-proxy.service [email protected]:/lib/systemd/system/
scp -r /lib/systemd/system/kubelet.service kube-proxy.service [email protected]:/lib/systemd/system/
更改kubelet 和proxy配置文件中ip为对应节点 ip
在node节点 启动服务
systemctl start kubelet
systemctl status kubelet
systemctl start kube-proxy
systemctl status kube-proxy
通过 CSR 请求,在任意一台master节点上
kubectl get csr
kubectl certificate approve node-csr-9UX_pXZAXjSZD9__Y8ZmbltKMrhWe8HiOTJymMp8DuA
kubectl get csr
NAME AGE REQUESTOR CONDITION
node-csr-9UX_pXZAXjSZD9__Y8ZmbltKMrhWe8HiOTJymMp8DuA 1m kubelet-bootstrap Approved,Issued
node-csr-_SuKog5hEOThZvKYkMWEtv7S9WcSi87Ced8SoidA2Y8 1h kubelet-bootstrap Approved,Issued
node-csr-jW_5ny5mXdB0MpGwxniYOpGrBHCFd6WOKMOh4jjd6bI 1m kubelet-bootstrap Approved,Issued
验证
kubectl get cs
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-2 Healthy {"health": "true"}
etcd-0 Healthy {"health": "true"}
etcd-1 Healthy {"health": "true"}
kubectl get nodes
NAME STATUS ROLES AGE VERSION
192.168.76.10 Ready <none> 1h v1.10.1
192.168.76.11 Ready <none> 6m v1.10.1
192.168.76.14 Ready <none> 3m v1.10.1