安装kubectl工具
- 下载安装文件
从 CHANGELOG 页面 下载 client 或 server tarball 文件
server 的 tarball kubernetes-server-linux-amd64.tar.gz 已经包含了 client(kubectl) 二进制文件,所以不用单独下载kubernetes-client-linux-amd64.tar.gz文件;
wget https://dl.k8s.io/v1.10.2/kubernetes-server-linux-amd64.tar.gz
tar -xzvf kubernetes-server-linux-amd64.tar.gz
cd kubernetes
- 将二进制文件拷贝到指定路径
cp server/bin/kubectl /usr/local/bin/
创建kubeconfig文件
以下操作只需要在master节点上执行,生成的*.kubeconfig文件可以直接拷贝到node节点的/etc/kubernetes目录下
创建TLS Bootstrapping token
- Token auth file
Token可以是任意的包含128 bit的字符串,可以使用安全的随机数发生器生成
export BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
cat > token.csv <<EOF
${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOF
注意:在进行后续操作前请检查 token.csv 文件,确认其中的 ${BOOTSTRAP_TOKEN} 环境变量已经被真实的值替换。
BOOTSTRAP_TOKEN 将被写入到 kube-apiserver 使用的 token.csv 文件和 kubelet 使用的 bootstrap.kubeconfig 文件,如果后续重新生成了 BOOTSTRAP_TOKEN,则需要:
- 更新 token.csv 文件,分发到所有机器 (master 和 node)的 /etc/kubernetes/ 目录下,分发到node节点上非必需;
- 重新生成 bootstrap.kubeconfig 文件,分发到所有 node 机器的 /etc/kubernetes/ 目录下;
- 重启 kube-apiserver 和 kubelet 进程;
- 重新 approve kubelet 的 csr 请求;
cp token.csv /etc/kubernetes/
创建kubelet bootstrapping kubeconf文件
cd /etc/kubernetes
export KUBE_APISERVER="https://192.168.255.197:6443"
# 设置集群参数
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=bootstrap.kubeconfig
# 设置客户端认证参数
kubectl config set-credentials kubelet-bootstrap \
--token=${BOOTSTRAP_TOKEN} \
--kubeconfig=bootstrap.kubeconfig
# 设置上下文参数
kubectl config set-context default \
--cluster=kubernetes \
--user=kubelet-bootstrap \
--kubeconfig=bootstrap.kubeconfig
# 设置默认上下文
kubectl config use-context default --kubeconfig=bootstrap.kubeconfig
- –embed-certs 为 true 时表示将 certificate-authority 证书写入到生成的 bootstrap.kubeconfig 文件中;
- 设置客户端认证参数时没有指定秘钥和证书,后续由 kube-apiserver 自动生成;
创建kube-proxy kubeconf文件
export KUBE_APISERVER="https://192.168.255.197:6443"
# 设置集群参数
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--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
- 设置集群参数和客户端认证参数时 –embed-certs 都为 true,这会将 certificate-authority、client-certificate 和 client-key 指向的证书文件内容写入到生成的 kube-proxy.kubeconfig 文件中;
- kube-proxy.pem 证书中 CN 为 system:kube-proxy,kube-apiserver 预定义的 RoleBinding cluster-admin 将User system:kube-proxy 与 Role system:node-proxier 绑定,该 Role 授予了调用 kube-apiserver Proxy 相关 API 的权限;
分发kubeconfig文件
将两个 kubeconfig 文件分发到所有 Node 机器的 /etc/kubernetes/ 目录
cp *.kubeconfig /etc/kubernetes/
总结
到目前为止,已经生成的文件清单如下:
# tree /etc/kubernetes/
/etc/kubernetes/
├── bootstrap.kubeconfig
├── kube-proxy.kubeconfig
├── ssl
│ ├── admin-key.pem
│ ├── admin.pem
│ ├── ca-key.pem
│ ├── ca.pem
│ ├── kube-proxy-key.pem
│ ├── kube-proxy.pem
│ ├── kubernetes-key.pem
│ └── kubernetes.pem
└── token.csv
1 directory, 11 files
分发证书文件及kubeconfig文件到对应节点
- 复制 bootstrap.kubeconfig、kube-proxy.kubeconfig、 token.csv 文件到k8s集群的所有机器的 /etc/kubernetes/目录下(etcd节点除外)
- 复制 ca.pem、kubernetes-key.pem、kubernetes.pem 到etcd节点的 /etc/kubernetes/ssl目录下, etcd共用kubernetes证书文件
- 复制 ca.pem、kubernetes-key.pem、kubernetes.pem 到api-server节点的 /etc/kubernetes/ssl目录下
- 复制 admin-key.pem、admin.pem 、ca-key.pem、 ca.pem 到主备master节点/etc/kubernetes/ssl目录下
- 复制 ca.pem、kube-proxy-key.pem、kube-proxy.pem 到所有node 节点/etc/kubernetes/ssl目录下