一.部署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.pemCA根证书文件
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.pemCA根证书
admin.pemkubectl的TLS认证证书,具有admin权限
admin-key.pemkubectl的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.pemCA根证书
kubelet-client.crtkubectl的TLS认证证书
kubelet-client.keykubectl的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.pemCA根证书
ca-key.pemCA端私钥
Server.pemkube-apiserver的tls认证证书
Server-key.pemkube-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.pemCA根证书
ca-key.pemkube-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类似
Logo

开源、云原生的融合云平台

更多推荐