参考自:http://blog.51cto.com/lizhenliang/2325770 Master apiserver启用TLS认证后,Node节点kubelet组件想要加入集群,必须使用CA签发的有效证书才能与apiserver通信,当Node节点很多时,签署证书是一件很繁琐的事情,因此有了TLS Bootstrapping机制,kubelet会以一个低权限用户自动向apiserver申请证书,kubelet的证书由apiserver动态签署。

以下步骤在master中执行
# 在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文件创建及执行
./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
部署kubelet组件

将下载的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

以下步骤是在node中进行

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 <<EOF >/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 <<EOF >/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 <<EOF >/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
#查看是否配置正确

Graylog k8s 部署 使用已有的es和mongodb_bootstrap

在Master节点查看请求签名的Node:

kubectl get csr
kubectl certificate approve ***ID
kubectl get node
部署kube-proxy组件
vi proxy.sh
./proxy.sh 10.0.3.104

kube-proxy的配置文件如下

#cat proxy.sh
#!/bin/bash

NODE_ADDRESS=$1

cat <<EOF >/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 <<EOF >/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
配置另一台node主机

将配置文件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生成

Graylog k8s 部署 使用已有的es和mongodb_SSL_02


(2)修改kube-proxy文件

--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

若出现下述错误:

Graylog k8s 部署 使用已有的es和mongodb_SSL_03

解决方法:

在node上修改

#vi /opt/kubernetes/cfg/kubelet.config
#---末尾添加---#
authentication:
  anonymous:
    enabled: true

Graylog k8s 部署 使用已有的es和mongodb_ide_04

#绑定一个cluster-admin的权限
kubectl create clusterrolebinding system:anonymous --clusterrole=cluster-admin --user=system:anonymous

成功:

Graylog k8s 部署 使用已有的es和mongodb_SSL_05


Graylog k8s 部署 使用已有的es和mongodb_ide_06


在node上访问:curl 10.0.0.74:80

在浏览器上访问:任一node即可,如10.0.3.104:37279

Graylog k8s 部署 使用已有的es和mongodb_SSL_07