参考自:http://blog.51cto.com/lizhenliang/2325770
Master apiserver启用TLS认证后,Node节点kubelet组件想要加入集群,必须使用CA签发的有效证书才能与apiserver通信,当Node节点很多时,签署证书是一件很繁琐的事情,因此有了TLS Bootstrapping机制,kubelet会以一个低权限用户自动向apiserver申请证书,kubelet的证书由apiserver动态签署。
# 在master中将kubelet-bootstrap用户绑定到系统集群角色
kubectl create clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper \
--user=kubelet-bootstrap
如果出错,kubectl无此命令,可将kubectl添加到环境变量中
#在master中配置kubeconfig文件
vi /etc/profile
#------在末尾添加:
PATH=$PATH:/opt/kubernetes/bin
#---------------
source /etc/profile
#在master的k8s目录下,创建kubeconfig文件夹//
mkdir kubeconfig
可随机生成一个32位字符串,用以创建一个token文件:
head -c 16 /dev/urandom |od -An -t x |tr -d ' '
#vi /opt/kubernetes/cfg/token.csv
#token的格式为:(第一列)随机字符串,(第二列)用户名,(第三列)UID,(第四列)用户名
eacee0f07c4b0866b37c577e6056f876,kubelet-bootstrap,10001,"system:kubelet-bootstrap"
NOTE:一定要记得替换kubeconfig.sh中的BOOTSTRAP_TOKEN值,切记切记,否则可能kubectl get csr。get不到
./kubeconfig.sh 10.0.3.171 /root/k8s/k8s-cert
ls
#-------生成
bootstrap.kubeconfig kube-proxy.kubeconfig
------------
# vi kubeconfig.sh
APISERVER=$1
SSL_DIR=$2 #证书地址
# 创建kubelet bootstrapping kubeconfig,记得修改BOOTSTRAP_TOKEN值
export KUBE_APISERVER="https://$APISERVER:6443"
BOOTSTRAP_TOKEN=eacee0f07c4b0866b37c577e6056f876
# 设置集群参数
kubectl config set-cluster kubernetes \
--certificate-authority=$SSL_DIR/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
#----------------------
# 创建kube-proxy kubeconfig文件
kubectl config set-cluster kubernetes \
--certificate-authority=$SSL_DIR/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=kube-proxy.kubeconfig
kubectl config set-credentials kube-proxy \
--client-certificate=$SSL_DIR/kube-proxy.pem \
--client-key=$SSL_DIR/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
将这两个配置文件拷贝到node中
scp bootstrap.kubeconfig kube-proxy.kubeconfig @10.0.3.104:/opt/kubernetes/cfg
注意:在node中创建相应文件夹
mkdir /opt/kubernetes/{bin,cfg,ssl} -p
将下载的kubernetes二进制包中的kubelet和kube-proxy拷贝到/opt/kubernetes/bin目录下。
scp /root/k8s/soft/kubernetes/server/bin/{kubelet,kube-proxy} root@10.0.3.104:/opt/kubernetes/bin
vi kubelet.sh
./kubelet.sh 10.0.3.104 10.0.0.2
kubelet的配置文件为
# cat kubelet.sh
#!/bin/bash
NODE_ADDRESS=$1
DNS_SERVER_IP=${2:-"10.0.0.2"}
cat </opt/kubernetes/cfg/kubelet
KUBELET_OPTS="--logtostderr=true \\
--v=4 \\
--address=${NODE_ADDRESS} \\
--hostname-override=${NODE_ADDRESS} \\
--kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \\
--experimental-bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \\
--config=/opt/kubernetes/cfg/kubelet.config \\
--cert-dir=/opt/kubernetes/ssl \\
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0"
EOF
cat </opt/kubernetes/cfg/kubelet.config
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: ${NODE_ADDRESS}
port: 10250
cgroupDriver: cgroupfs
clusterDNS:
- ${DNS_SERVER_IP}
clusterDomain: cluster.local.
failSwapOn: false
EOF
cat </usr/lib/systemd/system/kubelet.service
[Unit]
Description=Kubernetes Kubelet
After=docker.service
Requires=docker.service
[Service]
EnvironmentFile=/opt/kubernetes/cfg/kubelet
ExecStart=/opt/kubernetes/bin/kubelet \$KUBELET_OPTS
Restart=on-failure
KillMode=process
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable kubelet
systemctl restart kubelet
可进行kubelet的启动情况
ps -ef |grep kubelet #查看是否启动
ps -ef |grep kube #查看进程
在Master节点中审批Node加入集群:
启动后还没加入到集群中,需要手动允许该节点才可以。
# 先查看server证书
cfssl-certinfo -cert /opt/kubernetes/ssl/server.pem
#查看是否配置正确
kubectl get csr
kubectl certificate approve ***ID
kubectl get node
vi proxy.sh
./proxy.sh 10.0.3.104
kube-proxy的配置文件如下
#cat proxy.sh
#!/bin/bash
NODE_ADDRESS=$1
cat </opt/kubernetes/cfg/kube-proxy
KUBE_PROXY_OPTS="--logtostderr=true \\
--v=4 \\
--hostname-override=${NODE_ADDRESS} \\
--cluster-cidr=10.0.0.0/24 \\
--proxy-mode=ipvs \\
--kubeconfig=/opt/kubernetes/cfg/kube-proxy.kubeconfig"
EOF
cat </usr/lib/systemd/system/kube-proxy.service
[Unit]
Description=Kubernetes Proxy
After=network.target
[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-proxy
ExecStart=/opt/kubernetes/bin/kube-proxy \$KUBE_PROXY_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable kube-proxy
systemctl restart kube-proxy
将配置文件copy在另一个node02中
scp -r /opt/kubernetes/ root@10.0.3.150:/opt/
scp /usr/lib/systemd/system/{kubelet,kube-proxy}.service root@10.0.3.150:/usr/lib/systemd/system/
(1)首先由于在node01节点生成的kubelet相关文件不通用,需要删除并进一步颁发。(即删除下面列表中的kubelet.kubeconfig)
cd /opt/kubernetes/cfg/
rm kubelet.kubeconfig -f
#kubelet.kubeconfig通过systemctl restart kubelet生成
--hostname-override=10.0.3.104 \
修改为:
--hostname-override=10.0.3.150 \
(3)修改kubelet文件
--address=10.0.3.104 \
--hostname-override=10.0.3.104 \
修改为:
--address=10.0.3.150 \
--hostname-override=10.0.3.150 \
(4)删除/opt/kubernetes/ssl中的证书
rm /opt/kubernetes/ssl/* -f
然后就可以启动该node02中的kube啦
systemctl start kubelet
tail /var/log/messages
systemctl start kube-proxy
在Master节点中审批新的Node并加入集群:
查看请求签名的Node,并认证:
kubectl get csr
kubectl certificate approve ***ID
注:集群大规模认证的脚本# node_approve_csr.sh
#!/bin/bash
basedir=$(cd `dirname $0`;pwd)
## function
function node_approve_csr(){
CSR=`kubectl get csr | grep csr | grep Pending | awk '{print $1}' | head -n 1`
kubectl certificate approve $CSR
kubectl get nodes
}
node_approve_csr
查看集群状态
kubectl get node
kubectl get svc
在master01中运行:
kubectl run nginx --image=nginx --replicas=3
kubectl get pod
kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort
kubectl svc nginx
在node上修改
#vi /opt/kubernetes/cfg/kubelet.config
#---末尾添加---#
authentication:
anonymous:
enabled: true
#绑定一个cluster-admin的权限
kubectl create clusterrolebinding system:anonymous --clusterrole=cluster-admin --user=system:anonymous
在node上访问:curl 10.0.0.74:80
在浏览器上访问:任一node即可,如10.0.3.104:37279