Kubernetes集群部署(master组件部署)
- 一.部署master组件
- 1.master节点部署(192.168.159.128)
- 2.node01节点部署(192.168.159.129)
- 3.node02节点部署(192.168.159.130)
- 二.组件证书级配置参数
- 1.ca.pem & ca-key.pem & ca.csr
- 2.token.csv
- 3.bootstrap.kubeconfig
- 4.kubectl
- 5.kubelet
- 6.kube-apiserver
- 7.kube-controller-manager
- 8.kube-scheduler && kube-proxy
一.部署master组件
1.master节点部署(192.168.159.128)
##api-server生成证书##
cd k8s
rz master.zip
unzip master.zip
mkdir /opt/kubernetes/{cfg,bin,ssl} -p
mkdir k8s-cert
cd k8s-cert/
vim k8s-cert.sh
cat > ca-config.json <<EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF
cat > ca-csr.json <<EOF
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
#-----------------------
cat > server-csr.json <<EOF
{
"CN": "kubernetes",
"hosts": [
"10.0.0.1",
"127.0.0.1",
"192.168.159.128", #master1
"192.168.159.131", #master2
"192.168.159.132", #vip
"192.168.159.133", #lb (master)
"192.168.159.100", #lb (backup)
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server
#-----------------------
cat > admin-csr.json <<EOF
{
"CN": "admin",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "system:masters",
"OU": "System"
}
]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
#-----------------------
cat > kube-proxy-csr.json <<EOF
{
"CN": "system:kube-proxy",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
##生成k8s证书##
bash k8s-cert.sh
ls *pem #查看下可以看到生成了8个证书
cp ca*pem server*pem /opt/kubernetes/ssl/
cd .. #返回k8s目录
rz kubernetes-server-linux-amd64.tar.gz #上传kubernetes压缩包
tar zxvf kubernetes-server-linux-amd64.tar.gz #解压
cd /root/k8s/kubernetes/server/bin
cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/ #复制关键命令文件
cd /root/k8s
##使用 head -c 16 /dev/urandom | od -An -t x | tr -d ' ' 可以随机生成序列号##
vim /opt/kubernetes/cfg/token.csv
ff956db2dc9e180688a1906f6d5dcd58,kubelet-bootstrap,10001,"system:kubelet-bootstrap" #序列号,用户名,id,角色
##二进制文件,token,证书都准备好,开启apiserver##
bash apiserver.sh 192.168.159.128 https://192.168.159.128:2379,https://192.168.159.129:2379,https://192.168.159.130:2379
##检查进程是否启动成功##
ps aux | grep kube
##查看配置文件##
cat /opt/kubernetes/cfg/kube-apiserver
##监听的https端口##
netstat -ntap | grep 6443
netstat -ntap | grep 8080
##启动scheduler服务##
./scheduler.sh 127.0.0.1
ps aux | grep ku
chmod +x controller-manager.sh
##启动controller-manager##
./controller-manager.sh 127.0.0.1
##查看master 节点状态##
/opt/kubernetes/bin/kubectl get cs
2.node01节点部署(192.168.159.129)
##master节点上操作##
cd k8s/kubernetes/server/bin/
##把 kubelet、kube-proxy拷贝到node节点上去##
scp kubelet kube-proxy root@192.168.159.129:/opt/kubernetes/bin/
scp kubelet kube-proxy root@192.168.159.130:/opt/kubernetes/bin/
##nod01节点操作(复制node.zip到/root目录下再解压)##
rz node.zip
unzip node.zip
##回到master上操作##
cd /root/k8s
mkdir kubeconfig
cd kubeconfig/
rz kubeconfig.sh
##拷贝kubeconfig.sh文件进行重命名##
mv kubeconfig.sh kubeconfig
vim kubeconfig
##删除以下部分##
# 创建 TLS Bootstrapping Token
#BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
BOOTSTRAP_TOKEN=0fb61c46f8991b718eb38d27b605b008
cat > token.csv <<EOF
${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOF
##获取token信息##
cat /opt/kubernetes/cfg/token.csv
##配置文件修改为tokenID##
##设置客户端认证参数#
kubectl config set-credentials kubelet-bootstrap \
--token=ff956db2dc9e180688a1906f6d5dcd58 \
--kubeconfig=bootstrap.kubeconfig
##设置环境变量(可以写入到/etc/profile中)##
vim /etc/profile #末行加入
export PATH=$PATH:/opt/kubernetes/bin/
kubectl get cs
##生成配置文件##
bash kubeconfig 192.168.159.128 /root/k8s/k8s-cert/
##拷贝配置文件到node节点##
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.159.129:/opt/kubernetes/cfg/
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.159.130:/opt/kubernetes/cfg/
##创建bootstrap角色赋予权限用于连接apiserver请求签名##
kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
##在node01节点上操作##
bash kubelet.sh 192.168.159.129 #启动kubelet
##检查kubelet服务启动##
ps aux | grep kube
##master上操作,检查到node01节点的请求##
kubectl get csr
kubectl certificate approve node-csr-NOI-node-csr-HISyFrvCCN2mARJPzTDTF5Zz1nEN21gheMQhzI44gAQ
##继续查看证书状态##
kubectl get csr
##查看群集节点,成功加入node01节点##
kubectl get node
##在node01节点操作,启动proxy服务##
bash proxy.sh 192.168.159.129
systemctl status kube-proxy.service
3.node02节点部署(192.168.159.130)
##在node01节点操作##
##把现成的/opt/kubernetes目录复制到其他节点进行修改即可##
scp -r /opt/kubernetes/ root@192.168.159.130:/opt/
scp /usr/lib/systemd/system/{kubelet,kube-proxy}.service root@192.168.159.130:/usr/lib/systemd/system/
##在node02上操作,进行修改##
首先删除复制过来的证书,等会node02会自行申请证书
cd /opt/kubernetes/ssl/
rm -rf *
修改配置文件kubelet kubelet.config kube-proxy(三个配置文件)
cd ../cfg/
vim kubelet
vim kubelet.config
vim kube-proxy
##启动服务##
systemctl start kubelet.service
systemctl enable kubelet.service
systemctl start kube-proxy.service
systemctl enable kube-proxy.service
##在master上操作查看请求##
kubectl get csr
##授权许可加入群集##
kubectl certificate approve node-csr-w6qSeZYALLS7yFnsVbjhn3tNSG_bkVRouQgSXam560Q
kubectl get node #查看群集中的节点
二.组件证书级配置参数
1.ca.pem & ca-key.pem & ca.csr
- 建立完整TLS加密通信,需要有一个CA认证机构,会向客户端下发根证书、服务端证书以及签名私钥给客户端。ca.pem & ca-key.pem & ca.csr组成了一个自签名的CA机构。
证书名称 | 作用 |
ca.pem | CA根证书文件 |
ca-key.pem | 服务端私钥,用于对客户端请求的解密和签名 |
ca.csr | 证书签名请求,用于交叉签名或重新签名 |
2.token.csv
- 该文件为一个用户的描述文件,基本格式为 Token,用户名,UID,用户组;这个文件在 apiserver 启动时被 apiserver 加载,然后就相当于在集群内创建了一个这个用户;接下来就可以用 RBAC 给他授权
3.bootstrap.kubeconfig
- 该文件中内置了 token.csv 中用户的 Token,以及 apiserver CA 证书;kubelet 首次启动会加载此文件,使用 apiserver CA 证书建立与 apiserver 的 TLS 通讯,使用其中的用户 Token 作为身份标识像 apiserver 发起 CSR 请求
4.kubectl
- kubectl只是个go编写的可执行程序,只要为kubectl配置合适的kubeconfig,就可以在集群中的任意节点使用 。kubectl的权限为admin,具有访问kubernetes所有api的权限。
证书名称 | 作用 |
ca.pem | CA根证书 |
admin.pem | kubectl的TLS认证证书,具有admin权限 |
admin-key.pem | kubectl的TLS认证私钥 |
--certificate-authority=/opt/kubernetes/ssl/ca.pem #设置了该集群的根证书路径, --embed-certs为true表示将--certificate-authority证书写入到kubeconfig中
--client-certificate=/opt/kubernetes/ssl/admin.pem #指定kubectl证书
--client-key=/opt/kubernetes/ssl/admin-key.pem #指定kubectl私钥
5.kubelet
证书名称 | 作用 |
ca.pem | CA根证书 |
kubelet-client.crt | kubectl的TLS认证证书 |
kubelet-client.key | kubectl的TLS认证私钥 |
kubelet.crt | 独立于 apiserver CA 的自签 CA |
kubelet.key | 独立于 apiserver CA 的私钥 |
- 当成功签发证书后,目标节点的 kubelet 会将证书写入到 --cert-dir= 选项指定的目录中;此时如果不做其他设置应当生成上述除ca.pem以外的4个文件
- kubelet-client.crt 该文件在 kubelet 完成 TLS bootstrapping 后生成,此证书是由 controller manager 签署的,此后 kubelet 将会加载该证书,用于与 apiserver 建立 TLS 通讯,同时使用该证书的 CN 字段作为用户名,O 字段作为用户组向 apiserver 发起其他请求
- kubelet.crt 该文件在 kubelet 完成 TLS bootstrapping 后并且没有配置 --feature-gates=RotateKubeletServerCertificate=true 时才会生成;这种情况下该文件为一个独立于 apiserver CA 的自签 CA 证书,有效期为 1 年;被用作 kubelet 10250 api 端口
6.kube-apiserver
- kube-apiserver是在部署kubernetes集群是最需要先启动的组件,也是和集群交互的核心组件。
使用的证书 | 证书作用 |
ca.pem | CA根证书 |
ca-key.pem | CA端私钥 |
Server.pem | kube-apiserver的tls认证证书 |
Server-key.pem | kube-apiserver的tls认证私钥 |
- –token-auth-file=/opt/kubernetes/cfg/token.csv 指定了token.csv的位置,用于kubelet 组件 第一次启动时没有证书如何连接 apiserver 。 Token 和 apiserver 的 CA 证书被写入了 kubelet 所使用的 bootstrap.kubeconfig 配置文件中;这样在首次请求时,kubelet 使用 bootstrap.kubeconfig 中的 apiserver CA 证书来与 apiserver 建立 TLS 通讯,使用 bootstrap.kubeconfig 中的用户 Token 来向 apiserver 声明自己的 RBAC 授权身份
- –tls-cert-file=/opt/kubernetes/ssl/server.pem 指定kube-apiserver证书地址
- –tls-private-key-file=/opt/kubernetes/ssl/server-key.pem 指定kube-apiserver私钥地址
- –client-ca-file=/opt/kubernetes/ssl/ca.pem 指定根证书地址
- –service-account-key-file=/opt/kubernetes/ssl/ca-key.pem 包含PEM-encoded x509 RSA公钥和私钥的文件路径,用于验证Service Account的token,如果不指定,则使用–tls-private-key-file指定的文件
- –etcd-cafile=/opt/etcd/ssl/ca.pem 到etcd安全连接使用的SSL CA文件
- –etcd-certfile=/opt/etcd/ssl/server.pem 到etcd安全连接使用的SSL 证书文件
- –etcd-keyfile=/opt/etcd/ssl/server-key.pem 到etcd安全连接使用的SSL 私钥文件
7.kube-controller-manager
- kubelet 发起的 CSR 请求都是由 kube-controller-manager 来做实际签署的,所有使用的证书都是根证书的密钥对 。由于kube-controller-manager是和kube-apiserver部署在同一节点上,且使用非安全端口通信,故不需要证书
使用的证书 | 证书作用 |
ca.pem | CA根证书 |
ca-key.pem | kube-apiserver的tls认证私钥 |
- –cluster-signing-cert-file=/opt/kubernetes/ssl/ca.pem 指定签名的CA机构根证书,用来签名为 TLS BootStrap 创建的证书和私钥
- –cluster-signing-key-file=/opt/kubernetes/ssl/ca-key.pem 指定签名的CA机构私钥,用来签名为 TLS BootStrap 创建的证书和私钥
- –service-account-private-key-file=/opt/kubernetes/ssl/ca-key.pem 同上
- –root-ca-file=/opt/kubernetes/ssl/ca.pem 根CA证书文件路径 ,用来对 kube-apiserver 证书进行校验,指定该参数后,才会在Pod 容器的 ServiceAccount 中放置该 CA 证书文件
- –kubeconfig kubeconfig配置文件路径,在配置文件中包括Master的地址信息及必要认证信息
8.kube-scheduler && kube-proxy
- kube-scheduler是和kube-apiserver一般部署在同一节点上,且使用非安全端口通信,故启动参参数中没有指定证书的参数可选 。 若分离部署,可在kubeconfig文件中指定证书,使用kubeconfig认证,kube-proxy类似