一 安装和配置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.crtkubelet-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将User system:kube-proxy与 Role system:node-proxier绑定,该 Role 授予了调用 kube-apiserverProxy 相关 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

results matching ""

    No results matching ""