• 目前生产部署Kubernetes集群主要有两种方式

    • kuberadm

      Kubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。

    • 二进制包

      从github下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。

      Kubeadm降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署Kubernetes集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。

  • 在开始之前,部署Kubernetes集群机器需要满足以下几个条件:
    • 一台或多台机器,操作系统 CentOS7.x-86_x64
    • 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
    • 集群中所有机器之间网络互通
    • 可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点
    • 禁止swap分区
软件 版本
操作系统 CentOS7.8_x64 (mini)
Docker 19-ce
Kubernetes 1.18

img

角色 IP 组件
k8s-master 192.168.0.201 kube-apiserver,kube-controller-manager,kube-scheduler,etcd
k8s-node1 192.168.0.202 kubelet,kube-proxy,docker etcd
k8s-node2 192.168.0.203 kubelet,kube-proxy,docker,etcd
  1. # 关闭防火墙
  2. systemctl stop firewalld
  3. systemctl disable firewalld
  4. # 关闭selinux
  5. sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
  6. setenforce 0 # 临时
  7. # 关闭swap
  8. swapoff -a # 临时
  9. sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
  10. # 根据规划设置主机名
  11. hostnamectl set-hostname <hostname>
  12. # 在master添加hosts
  13. cat >> /etc/hosts << EOF
  14. 192.168.0.201 k8s-master
  15. 192.168.0.202 k8s-node1
  16. 192.168.0.203 k8s-node2
  17. EOF
  18. # 将桥接的IPv4流量传递到iptables的链
  19. cat > /etc/sysctl.d/k8s.conf << EOF
  20. net.bridge.bridge-nf-call-ip6tables = 1
  21. net.bridge.bridge-nf-call-iptables = 1
  22. EOF
  23. sysctl --system # 生效
  24. # 时间同步
  25. yum install ntpdate -y
  26. ntpdate time.windows.com

Etcd 是一个分布式键值存储系统,Kubernetes使用Etcd进行数据存储,所以先准备一个Etcd数据库,为解决Etcd单点故障,应采用集群方式部署,这里使用3台组建集群,可容忍1台机器故障,当然,你也可以使用5台组建集群,可容忍2台机器故障。

节点名称 IP
etcd-1 192.168.0.201
etcd-2 192.168.0.202
etcd-3 192.168.0.203

注:为了节省机器,这里与K8s节点机器复用。也可以独立于k8s集群之外部署,只要apiserver能连接到就行。

cfssl是一个开源的证书管理工具,使用json文件生成证书,相比openssl更方便使用。

找任意一台服务器操作,这里用Master节点

  1. wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
  2. wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
  3. wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
  4. chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64
  5. mv cfssl_linux-amd64 /usr/local/bin/cfssl
  6. mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
  7. mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo
  1. [root@k8s-master ~]# mkdir -p ~/cfssl/
  2. [root@k8s-master ~]# cd cfssl/
  3. [root@k8s-master cfssl]# pwd
  4. /root/cfssl
  5. [root@k8s-master cfssl]# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
  6. [root@k8s-master cfssl]# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
  7. [root@k8s-master cfssl]# wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
  8. [root@k8s-master cfssl]# chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64
  9. [root@k8s-master cfssl]# mv cfssl_linux-amd64 /usr/local/bin/cfssl
  10. [root@k8s-master cfssl]# mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
  11. [root@k8s-master cfssl]# mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo
  1. [root@k8s-master ~]# mkdir -p ~/TLS/{etcd,k8s}
  2. [root@k8s-master ~]# cd /root/TLS/etcd/

执行json格式配置

  1. cat > ca-config.json << EOF
  2. {
  3. "signing": {
  4. "default": {
  5. "expiry": "87600h"
  6. },
  7. "profiles": {
  8. "www": {
  9. "expiry": "87600h",
  10. "usages": [
  11. "signing",
  12. "key encipherment",
  13. "server auth",
  14. "client auth"
  15. ]
  16. }
  17. }
  18. }
  19. }
  20. EOF
  21. cat > ca-csr.json << EOF
  22. {
  23. "CN": "etcd CA",
  24. "key": {
  25. "algo": "rsa",
  26. "size": 2048
  27. },
  28. "names": [
  29. {
  30. "C": "CN",
  31. "L": "Beijing",
  32. "ST": "Beijing"
  33. }
  34. ]
  35. }
  36. EOF
  1. [root@k8s-master etcd]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
  2. 2020/11/17 20:53:48 [INFO] generating a new CA key and certificate from CSR
  3. 2020/11/17 20:53:48 [INFO] generate received request
  4. 2020/11/17 20:53:48 [INFO] received CSR
  5. 2020/11/17 20:53:48 [INFO] generating key: rsa-2048
  6. 2020/11/17 20:53:48 [INFO] encoded CSR
  7. 2020/11/17 20:53:48 [INFO] signed certificate with serial number 101950529088026535677297860863057856432140076739
  1. [root@k8s-master etcd]# ls *pem
  2. ca-key.pem ca.pem

创建证书申请文件

  1. cat > server-csr.json << EOF
  2. {
  3. "CN": "etcd",
  4. "hosts": [
  5. "192.168.0.201",
  6. "192.168.0.202",
  7. "192.168.0.203"
  8. ],
  9. "key": {
  10. "algo": "rsa",
  11. "size": 2048
  12. },
  13. "names": [
  14. {
  15. "C": "CN",
  16. "L": "BeiJing",
  17. "ST": "BeiJing"
  18. }
  19. ]
  20. }
  21. EOF

执行配置文件

  1. [root@k8s-master etcd]# cat > server-csr.json << EOF
  2. > {
  3. > "CN": "etcd",
  4. > "hosts": [
  5. > "192.168.0.201",
  6. > "192.168.0.202",
  7. > "192.168.0.203"
  8. > ],
  9. > "key": {
  10. > "algo": "rsa",
  11. > "size": 2048
  12. > },
  13. > "names": [
  14. > {
  15. > "C": "CN",
  16. > "L": "BeiJing",
  17. > "ST": "BeiJing"
  18. > }
  19. > ]
  20. > }
  21. > EOF

注:上述文件hosts字段中IP为所有etcd节点的集群内部通信IP,一个都不能少!为了方便后期扩容可以多写几个预留的IP。

  1. [root@k8s-master etcd]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
  2. 2020/11/17 21:03:05 [INFO] generate received request
  3. 2020/11/17 21:03:05 [INFO] received CSR
  4. 2020/11/17 21:03:05 [INFO] generating key: rsa-2048
  5. 2020/11/17 21:03:05 [INFO] encoded CSR
  6. 2020/11/17 21:03:05 [INFO] signed certificate with serial number 134705649830183343899987337527377566420156796503
  7. 2020/11/17 21:03:05 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
  8. websites. For more information see the Baseline Requirements for the Issuance and Management
  9. of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
  10. specifically, section 10.2.3 ("Information Requirements").
  1. [root@k8s-master etcd]# ls server*pem
  2. server-key.pem server.pem
  1. [root@k8s-master etcd]# mkdir -p ~/tools
  2. [root@k8s-master etcd]# cd /root/tools/
  3. [root@k8s-master tools]# wget https://github.com/etcd-io/etcd/releases/download/v3.4.9/etcd-v3.4.9-linux-amd64.tar.gz
  4. [root@k8s-master tools]# ll
  5. 总用量 16960
  6. -rw-r--r--. 1 root root 17364053 11 17 21:09 etcd-v3.4.9-linux-amd64.tar.gz

以下在节点1上操作,为简化操作,待会将节点1生成的所有文件拷贝到节点2和节点3.

  1. mkdir /opt/etcd/{bin,cfg,ssl} -p
  2. tar zxvf etcd-v3.4.9-linux-amd64.tar.gz
  3. mv etcd-v3.4.9-linux-amd64/{etcd,etcdctl} /opt/etcd/bin/

执行上面命令工作目录

  1. [root@k8s-master etcd]# cd /root/tools/
  2. [root@k8s-master tools]# ll
  3. 总用量 16960
  4. -rw-r--r--. 1 root root 17364053 11 17 21:09 etcd-v3.4.9-linux-amd64.tar.gz
  5. [root@k8s-master tools]# tar zxvf etcd-v3.4.9-linux-amd64.tar.gz
  6. [root@k8s-master tools]# mv etcd-v3.4.9-linux-amd64/etcd /opt/etcd/bin/
  7. [root@k8s-master tools]# mv etcd-v3.4.9-linux-amd64/etcdctl /opt/etcd/bin/
  1. cat > /opt/etcd/cfg/etcd.conf << EOF
  2. #[Member]
  3. ETCD_NAME="etcd-1"
  4. ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
  5. ETCD_LISTEN_PEER_URLS="https://192.168.0.201:2380"
  6. ETCD_LISTEN_CLIENT_URLS="https://192.168.0.201:2379"
  7. #[Clustering]
  8. ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.0.201:2380"
  9. ETCD_ADVERTISE_CLIENT_URLS="https://192.168.0.201:2379"
  10. ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.0.201:2380,etcd-2=https://192.168.0.202:2380,etcd-3=https://192.168.0.203:2380"
  11. ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
  12. ETCD_INITIAL_CLUSTER_STATE="new"
  13. EOF
  • ETCD_NAME:节点名称,集群中唯一

  • ETCD_DATA_DIR:数据目录

  • ETCD_LISTEN_PEER_URLS:集群通信监听地址

  • ETCD_LISTEN_CLIENT_URLS:客户端访问监听地址

  • ETCD_INITIAL_ADVERTISE_PEER_URLS:集群通告地址

  • ETCD_ADVERTISE_CLIENT_URLS:客户端通告地址

  • ETCD_INITIAL_CLUSTER:集群节点地址

  • ETCD_INITIAL_CLUSTER_TOKEN:集群Token

  • ETCD_INITIAL_CLUSTER_STATE:加入集群的当前状态,new是新集群,existing表示加入已有集群

  • 服务器执行配置

    1. [root@k8s-master ~]# cat > /opt/etcd/cfg/etcd.conf << EOF
    2. > #[Member]
    3. > ETCD_NAME="etcd-1"
    4. > ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
    5. > ETCD_LISTEN_PEER_URLS="https://192.168.0.201:2380"
    6. > ETCD_LISTEN_CLIENT_URLS="https://192.168.0.201:2379"
    7. > #[Clustering]
    8. > ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.0.201:2380"
    9. > ETCD_ADVERTISE_CLIENT_URLS="https://192.168.0.201:2379"
    10. > ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.0.201:2380,etcd-2=https://192.168.0.202:2380,etcd-3=https://192.168.0.203:2380"
    11. > ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
    12. > ETCD_INITIAL_CLUSTER_STATE="new"
    13. > EOF
  1. cat > /usr/lib/systemd/system/etcd.service << EOF
  2. [Unit]
  3. Description=Etcd Server
  4. After=network.target
  5. After=network-online.target
  6. Wants=network-online.target
  7. [Service]
  8. Type=notify
  9. EnvironmentFile=/opt/etcd/cfg/etcd.conf
  10. ExecStart=/opt/etcd/bin/etcd \
  11. --cert-file=/opt/etcd/ssl/server.pem \
  12. --key-file=/opt/etcd/ssl/server-key.pem \
  13. --peer-cert-file=/opt/etcd/ssl/server.pem \
  14. --peer-key-file=/opt/etcd/ssl/server-key.pem \
  15. --trusted-ca-file=/opt/etcd/ssl/ca.pem \
  16. --peer-trusted-ca-file=/opt/etcd/ssl/ca.pem \
  17. --logger=zap
  18. Restart=on-failure
  19. LimitNOFILE=65536
  20. [Install]
  21. WantedBy=multi-user.target
  22. EOF
  • 服务器执行配置

    1. [root@k8s-master ~]# cat > /usr/lib/systemd/system/etcd.service << EOF
    2. > [Unit]
    3. > Description=Etcd Server
    4. > After=network.target
    5. > After=network-online.target
    6. > Wants=network-online.target
    7. > [Service]
    8. > Type=notify
    9. > EnvironmentFile=/opt/etcd/cfg/etcd.conf
    10. > ExecStart=/opt/etcd/bin/etcd \
    11. > --cert-file=/opt/etcd/ssl/server.pem \
    12. > --key-file=/opt/etcd/ssl/server-key.pem \
    13. > --peer-cert-file=/opt/etcd/ssl/server.pem \
    14. > --peer-key-file=/opt/etcd/ssl/server-key.pem \
    15. > --trusted-ca-file=/opt/etcd/ssl/ca.pem \
    16. > --peer-trusted-ca-file=/opt/etcd/ssl/ca.pem \
    17. > --logger=zap
    18. > Restart=on-failure
    19. > LimitNOFILE=65536
    20. > [Install]
    21. > WantedBy=multi-user.target
    22. > EOF

拷贝ca证书和etcd证书

  1. [root@k8s-master ~]# cp ~/TLS/etcd/ca*pem /opt/etcd/ssl/
  2. [root@k8s-master ~]# cp -a ~/TLS/etcd/server*pem /opt/etcd/ssl/
  3. [root@k8s-master ~]# ll /opt/etcd/ssl/
  4. 总用量 16
  5. -rw-------. 1 root root 1675 11 19 14:53 ca-key.pem
  6. -rw-r--r--. 1 root root 1265 11 19 14:53 ca.pem
  7. -rw-------. 1 root root 1675 11 17 21:03 server-key.pem
  8. -rw-r--r--. 1 root root 1338 11 17 21:03 server.pem
  1. [root@k8s-master ~]# scp -r /opt/etcd/ root@192.168.0.202:/opt
  2. [root@k8s-master ~]# scp -r /usr/lib/systemd/system/etcd.service root@192.168.0.202:/usr/lib/systemd/system/
  3. [root@k8s-master ~]# scp -r /opt/etcd/ root@192.168.0.203:/opt
  4. [root@k8s-master ~]# scp -r /usr/lib/systemd/system/etcd.service root@192.168.0.203:/usr/lib/systemd/system/
  1. [root@k8s-node1 ~]# vim /opt/etcd/cfg/etcd.conf
  2. [root@k8s-node1 ~]# cat /opt/etcd/cfg/etcd.conf
  3. #[Member]
  4. ETCD_NAME="etcd-2" # 修改此处,节点2改为etcd-2,节点3改为etcd-3
  5. ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
  6. ETCD_LISTEN_PEER_URLS="https://192.168.0.202:2380" # 修改此处为当前服务器IP
  7. ETCD_LISTEN_CLIENT_URLS="https://192.168.0.202:2379" # 修改此处为当前服务器IP
  8. #[Clustering]
  9. ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.0.202:2380" # 修改此处为当前服务器IP
  10. ETCD_ADVERTISE_CLIENT_URLS="https://192.168.0.202:2379" # 修改此处为当前服务器IP
  11. ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.0.201:2380,etcd-2=https://192.168.0.202:2380,etcd-3=https://192.168.0.203:2380"
  12. ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
  13. ETCD_INITIAL_CLUSTER_STATE="new"
  1. [root@k8s-node2 ~]# vim /opt/etcd/cfg/etcd.conf
  2. [root@k8s-node2 ~]# cat /opt/etcd/cfg/etcd.conf
  3. #[Member]
  4. ETCD_NAME="etcd-3" # 修改此处,节点2改为etcd-2,节点3改为etcd-3
  5. ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
  6. ETCD_LISTEN_PEER_URLS="https://192.168.0.203:2380" # 修改此处为当前服务器IP
  7. ETCD_LISTEN_CLIENT_URLS="https://192.168.0.203:2379" # 修改此处为当前服务器IP
  8. #[Clustering]
  9. ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.0.203:2380" # 修改此处为当前服务器IP
  10. ETCD_ADVERTISE_CLIENT_URLS="https://192.168.0.203:2379" # 修改此处为当前服务器IP
  11. ETCD_INITIAL_CLUSTER="etcd-1=https://192.168.0.201:2380,etcd-2=https://192.168.0.202:2380,etcd-3=https://192.168.0.203:2380"
  12. ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
  13. ETCD_INITIAL_CLUSTER_STATE="new"
  • 启动master节点

    1. [root@k8s-master ~]# systemctl daemon-reload
    2. [root@k8s-master ~]# systemctl start etcd
    3. [root@k8s-master ~]# systemctl enable etcd
    4. Created symlink from /etc/systemd/system/multi-user.target.wants/etcd.service to /usr/lib/systemd/system/etcd.service.
  • 启动node1节点

    1. [root@k8s-node1 ~]# systemctl daemon-reload
    2. [root@k8s-node1 ~]# systemctl start etcd
    3. [root@k8s-node1 ~]# systemctl enable etcd
    4. Created symlink from /etc/systemd/system/multi-user.target.wants/etcd.service to /usr/lib/systemd/system/etcd.service.
  • 启动node2节点

    1. [root@k8s-node2 ~]# systemctl daemon-reload
    2. [root@k8s-node2 ~]# systemctl start etcd
    3. [root@k8s-node2 ~]# systemctl enable etcd
    4. Created symlink from /etc/systemd/system/multi-user.target.wants/etcd.service to /usr/lib/systemd/system/etcd.service.
  1. [root@k8s-master ~]# ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.0.201:2379,https://192.168.0.202:2379,https://192.168.0.203:2379" endpoint health
  2. https://192.168.0.201:2379 is healthy: successfully committed proposal: took = 40.294783ms
  3. https://192.168.0.203:2379 is healthy: successfully committed proposal: took = 40.593516ms
  4. https://192.168.0.202:2379 is healthy: successfully committed proposal: took = 21.798951ms

如果输出上面信息,就说明集群部署成功。如果有问题第一步先看日志:/var/log/message 或 journalctl -u etcd

以下在所有节点操作,这里采用yum安装方式,

  1. yum install -y yum-utils device-mapper-persistent-data lvm2
  1. [root@k8s-master ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
  1. [root@k8s-node1 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
  1. [root@k8s-node2 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
  1. [root@k8s-master ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  2. 已加载插件:fastestmirror
  3. adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
  4. grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
  5. repo saved to /etc/yum.repos.d/docker-ce.repo
  1. [root@k8s-node1 ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  2. 已加载插件:fastestmirror
  3. adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
  4. grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
  5. repo saved to /etc/yum.repos.d/docker-ce.repo
  1. [root@k8s-node2 ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  2. 已加载插件:fastestmirror
  3. adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
  4. grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
  5. repo saved to /etc/yum.repos.d/docker-ce.repo
  1. [root@k8s-master ~]# yum install -y docker-ce
  1. [root@k8s-node1 ~]# yum install -y docker-ce
  1. [root@k8s-node2 ~]# yum install -y docker-ce
  1. mkdir -p /etc/docker
  2. cat > /etc/docker/daemon.json << EOF
  3. {
  4. "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
  5. }
  6. EOF
  1. /bin/systemctl daemon-reload
  2. /bin/systemctl start docker
  3. /bin/systemctl enable docker
  1. cat > ca-config.json << EOF
  2. {
  3. "signing": {
  4. "default": {
  5. "expiry": "87600h"
  6. },
  7. "profiles": {
  8. "kubernetes": {
  9. "expiry": "87600h",
  10. "usages": [
  11. "signing",
  12. "key encipherment",
  13. "server auth",
  14. "client auth"
  15. ]
  16. }
  17. }
  18. }
  19. }
  20. EOF
  21. cat > ca-csr.json << EOF
  22. {
  23. "CN": "kubernetes",
  24. "key": {
  25. "algo": "rsa",
  26. "size": 2048
  27. },
  28. "names": [
  29. {
  30. "C": "CN",
  31. "L": "Beijing",
  32. "ST": "Beijing",
  33. "O": "k8s",
  34. "OU": "System"
  35. }
  36. ]
  37. }
  38. EOF
  • 执行apiserver证书配置

    1. [root@k8s-master ~]# mkdir -p /root/TLS/apiserver
    2. [root@k8s-master ~]# cd /root/TLS/apiserver/
    3. [root@k8s-master apiserver]# ll
    4. 总用量 0
    5. [root@k8s-master apiserver]# cat > ca-config.json << EOF
    6. > {
    7. > "signing": {
    8. > "default": {
    9. > "expiry": "87600h"
    10. > },
    11. > "profiles": {
    12. > "kubernetes": {
    13. > "expiry": "87600h",
    14. > "usages": [
    15. > "signing",
    16. > "key encipherment",
    17. > "server auth",
    18. > "client auth"
    19. > ]
    20. > }
    21. > }
    22. > }
    23. > }
    24. > EOF
    25. [root@k8s-master apiserver]# cat > ca-csr.json << EOF
    26. > {
    27. > "CN": "kubernetes",
    28. > "key": {
    29. > "algo": "rsa",
    30. > "size": 2048
    31. > },
    32. > "names": [
    33. > {
    34. > "C": "CN",
    35. > "L": "Beijing",
    36. > "ST": "Beijing",
    37. > "O": "k8s",
    38. > "OU": "System"
    39. > }
    40. > ]
    41. > }
    42. > EOF
  • 执行生成ca证书

    1. [root@k8s-master apiserver]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
    2. 2020/11/19 21:02:47 [INFO] generating a new CA key and certificate from CSR
    3. 2020/11/19 21:02:47 [INFO] generate received request
    4. 2020/11/19 21:02:47 [INFO] received CSR
    5. 2020/11/19 21:02:47 [INFO] generating key: rsa-2048
    6. 2020/11/19 21:02:47 [INFO] encoded CSR
    7. 2020/11/19 21:02:47 [INFO] signed certificate with serial number 618964693704774402914754546857528123070512384496
    8. [root@k8s-master apiserver]# ll *pem
    9. -rw-------. 1 root root 1675 11 19 21:02 ca-key.pem
    10. -rw-r--r--. 1 root root 1359 11 19 21:02 ca.pem
  • 创建证书申请文件

    1. cat > server-csr.json << EOF
    2. {
    3. "CN": "kubernetes",
    4. "hosts": [
    5. "10.0.0.1",
    6. "127.0.0.1",
    7. "192.168.0.201",
    8. "192.168.0.202",
    9. "192.168.0.203",
    10. "kubernetes",
    11. "kubernetes.default",
    12. "kubernetes.default.svc",
    13. "kubernetes.default.svc.cluster",
    14. "kubernetes.default.svc.cluster.local"
    15. ],
    16. "key": {
    17. "algo": "rsa",
    18. "size": 2048
    19. },
    20. "names": [
    21. {
    22. "C": "CN",
    23. "L": "BeiJing",
    24. "ST": "BeiJing",
    25. "O": "k8s",
    26. "OU": "System"
    27. }
    28. ]
    29. }
    30. EOF
  • 执行生成apiserver证书配置

    1. [root@k8s-master /]# cd /root/TLS/apiserver/
    2. [root@k8s-master apiserver]# cat > server-csr.json << EOF
    3. > {
    4. > "CN": "kubernetes",
    5. > "hosts": [
    6. > "10.0.0.1",
    7. > "127.0.0.1",
    8. > "192.168.0.201",
    9. > "192.168.0.202",
    10. > "192.168.0.203",
    11. > "kubernetes",
    12. > "kubernetes.default",
    13. > "kubernetes.default.svc",
    14. > "kubernetes.default.svc.cluster",
    15. > "kubernetes.default.svc.cluster.local"
    16. > ],
    17. > "key": {
    18. > "algo": "rsa",
    19. > "size": 2048
    20. > },
    21. > "names": [
    22. > {
    23. > "C": "CN",
    24. > "L": "BeiJing",
    25. > "ST": "BeiJing",
    26. > "O": "k8s",
    27. > "OU": "System"
    28. > }
    29. > ]
    30. > }
    31. > EOF

    注:上述文件hosts字段中IP为所有Master/LB/VIP IP,一个都不能少!为了方便后期扩容可以多写几个预留的IP。

  • 执行生成证书

    1. [root@k8s-master apiserver]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server
    2. 2020/11/19 21:16:00 [INFO] generate received request
    3. 2020/11/19 21:16:00 [INFO] received CSR
    4. 2020/11/19 21:16:00 [INFO] generating key: rsa-2048
    5. 2020/11/19 21:16:01 [INFO] encoded CSR
    6. 2020/11/19 21:16:01 [INFO] signed certificate with serial number 61289883131760633497559745925872614733825752323
    7. 2020/11/19 21:16:01 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
    8. websites. For more information see the Baseline Requirements for the Issuance and Management
    9. of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
    10. specifically, section 10.2.3 ("Information Requirements").
    11. [root@k8s-master apiserver]# ls server*pem
    12. server-key.pem server.pem
  1. [root@k8s-master /]# mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
  2. [root@k8s-master apiserver]# cd /root/tools/
  3. [root@k8s-master tools]# wget https://storage.googleapis.com/kubernetes-release/release/v1.18.3/kubernetes-server-linux-amd64.tar.gz
  4. [root@k8s-master tools]# tar -zxvf kubernetes-server-linux-amd64.tar.gz
  5. [root@k8s-master tools]# cd kubernetes/server/bin/
  6. [root@k8s-master bin]# ll
  7. 总用量 1087376
  8. -rwxr-xr-x. 1 root root 48128000 5 20 2020 apiextensions-apiserver
  9. -rwxr-xr-x. 1 root root 39813120 5 20 2020 kubeadm
  10. -rwxr-xr-x. 1 root root 120668160 5 20 2020 kube-apiserver
  11. -rw-r--r--. 1 root root 8 5 20 2020 kube-apiserver.docker_tag
  12. -rw-------. 1 root root 174558720 5 20 2020 kube-apiserver.tar
  13. -rwxr-xr-x. 1 root root 110059520 5 20 2020 kube-controller-manager
  14. -rw-r--r--. 1 root root 8 5 20 2020 kube-controller-manager.docker_tag
  15. -rw-------. 1 root root 163950080 5 20 2020 kube-controller-manager.tar
  16. -rwxr-xr-x. 1 root root 44032000 5 20 2020 kubectl
  17. -rwxr-xr-x. 1 root root 113283800 5 20 2020 kubelet
  18. -rwxr-xr-x. 1 root root 38379520 5 20 2020 kube-proxy
  19. -rw-r--r--. 1 root root 8 5 20 2020 kube-proxy.docker_tag
  20. -rw-------. 1 root root 119099392 5 20 2020 kube-proxy.tar
  21. -rwxr-xr-x. 1 root root 42950656 5 20 2020 kube-scheduler
  22. -rw-r--r--. 1 root root 8 5 20 2020 kube-scheduler.docker_tag
  23. -rw-------. 1 root root 96841216 5 20 2020 kube-scheduler.tar
  24. -rwxr-xr-x. 1 root root 1687552 5 20 2020 mounter
  25. [root@k8s-master bin]# cp kube-apiserver /opt/kubernetes/bin/
  26. [root@k8s-master bin]# cp kube-scheduler /opt/kubernetes/bin/
  27. [root@k8s-master bin]# cp kube-controller-manager /opt/kubernetes/bin/
  28. [root@k8s-master bin]# cp kubectl /usr/bin/
  1. cat > /opt/kubernetes/cfg/kube-apiserver.conf << EOF
  2. KUBE_APISERVER_OPTS="--logtostderr=false \\
  3. --v=2 \\
  4. --log-dir=/opt/kubernetes/logs \\
  5. --etcd-servers=https://192.168.0.201:2379,https://192.168.0.202:2379,https://192.168.0.203:2379 \\
  6. --bind-address=192.168.0.201 \\
  7. --secure-port=6443 \\
  8. --advertise-address=192.168.0.201 \\
  9. --allow-privileged=true \\
  10. --service-cluster-ip-range=10.0.0.0/24 \\
  11. --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction \\
  12. --authorization-mode=RBAC,Node \\
  13. --enable-bootstrap-token-auth=true \\
  14. --token-auth-file=/opt/kubernetes/cfg/token.csv \\
  15. --service-node-port-range=30000-32767 \\
  16. --kubelet-client-certificate=/opt/kubernetes/ssl/server.pem \\
  17. --kubelet-client-key=/opt/kubernetes/ssl/server-key.pem \\
  18. --tls-cert-file=/opt/kubernetes/ssl/server.pem \\
  19. --tls-private-key-file=/opt/kubernetes/ssl/server-key.pem \\
  20. --client-ca-file=/opt/kubernetes/ssl/ca.pem \\
  21. --service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \\
  22. --etcd-cafile=/opt/etcd/ssl/ca.pem \\
  23. --etcd-certfile=/opt/etcd/ssl/server.pem \\
  24. --etcd-keyfile=/opt/etcd/ssl/server-key.pem \\
  25. --audit-log-maxage=30 \\
  26. --audit-log-maxbackup=3 \\
  27. --audit-log-maxsize=100 \\
  28. --audit-log-path=/opt/kubernetes/logs/k8s-audit.log"
  29. EOF

注释:上面两个\ \ 第一个是转义符,第二个是换行符,使用转义符是为了使用EOF保留换行符。

  • –logtostderr:启用日志
  • —v:日志等级
  • –log-dir:日志目录
  • –etcd-servers:etcd集群地址
  • –bind-address:监听地址
  • –secure-port:https安全端口
  • –advertise-address:集群通告地址
  • –allow-privileged:启用授权
  • –service-cluster-ip-range:Service虚拟IP地址段
  • –enable-admission-plugins:准入控制模块
  • –authorization-mode:认证授权,启用RBAC授权和节点自管理
  • –enable-bootstrap-token-auth:启用TLS bootstrap机制
  • –token-auth-file:bootstrap token文件
  • –service-node-port-range:Service nodeport类型默认分配端口范围
  • –kubelet-client-xxx:apiserver访问kubelet客户端证书
  • –tls-xxx-file:apiserver https证书
  • –etcd-xxxfile:连接Etcd集群证书
  • –audit-log-xxx:审计日志
  1. [root@k8s-master /]# cat > /opt/kubernetes/cfg/kube-apiserver.conf << EOF
  2. > KUBE_APISERVER_OPTS="--logtostderr=false \\
  3. > --v=2 \\
  4. > --log-dir=/opt/kubernetes/logs \\
  5. > --etcd-servers=https://192.168.0.201:2379,https://192.168.0.202:2379,https://192.168.0.203:2379 \\
  6. > --bind-address=192.168.0.201 \\
  7. > --secure-port=6443 \\
  8. > --advertise-address=192.168.0.201 \\
  9. > --allow-privileged=true \\
  10. > --service-cluster-ip-range=10.0.0.0/24 \\
  11. > --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction \\
  12. > --authorization-mode=RBAC,Node \\
  13. > --enable-bootstrap-token-auth=true \\
  14. > --token-auth-file=/opt/kubernetes/cfg/token.csv \\
  15. > --service-node-port-range=30000-32767 \\
  16. > --kubelet-client-certificate=/opt/kubernetes/ssl/server.pem \\
  17. > --kubelet-client-key=/opt/kubernetes/ssl/server-key.pem \\
  18. > --tls-cert-file=/opt/kubernetes/ssl/server.pem \\
  19. > --tls-private-key-file=/opt/kubernetes/ssl/server-key.pem \\
  20. > --client-ca-file=/opt/kubernetes/ssl/ca.pem \\
  21. > --service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \\
  22. > --etcd-cafile=/opt/etcd/ssl/ca.pem \\
  23. > --etcd-certfile=/opt/etcd/ssl/server.pem \\
  24. > --etcd-keyfile=/opt/etcd/ssl/server-key.pem \\
  25. > --audit-log-maxage=30 \\
  26. > --audit-log-maxbackup=3 \\
  27. > --audit-log-maxsize=100 \\
  28. > --audit-log-path=/opt/kubernetes/logs/k8s-audit.log"
  29. > EOF
  1. [root@k8s-master /]# cp -a /root/TLS/apiserver/ca*pem /opt/kubernetes/ssl/
  2. [root@k8s-master /]# cp -a /root/TLS/apiserver/server*pem /opt/kubernetes/ssl/
  3. [root@k8s-master /]# ll /opt/kubernetes/ssl/
  4. 总用量 16
  5. -rw-------. 1 root root 1675 11 19 21:02 ca-key.pem
  6. -rw-r--r--. 1 root root 1359 11 19 21:02 ca.pem
  7. -rw-------. 1 root root 1679 11 19 21:16 server-key.pem
  8. -rw-r--r--. 1 root root 1627 11 19 21:16 server.pem

TLS Bootstraping:Master apiserver启用TLS认证后,Node节点kubelet和kube-proxy要与kube-apiserver进行通信,必须使用CA签发的有效证书才可以,当Node节点很多时,这种客户端证书颁发需要大量工作,同样也会增加集群扩展复杂度。为了简化流程,Kubernetes引入了TLS bootstraping机制来自动颁发客户端证书,kubelet会以一个低权限用户自动向apiserver申请证书,kubelet的证书由apiserver动态签署。所以强烈建议在Node上使用这种方式,目前主要用于kubelet,kube-proxy还是由我们统一颁发一个证书。

  • TLS bootstraping 工作流程:

    image-20201122181624645

  • 创建上述配置文件中token文件:

    1. cat > /opt/kubernetes/cfg/token.csv << EOF
    2. c47ffb939f5ca36231d9e3121a252940,kubelet-bootstrap,10001,"system:node-bootstrapper"
    3. EOF

    执行以上操作

    1. [root@k8s-master ~]# cat > /opt/kubernetes/cfg/token.csv << EOF
    2. > c47ffb939f5ca36231d9e3121a252940,kubelet-bootstrap,10001,"system:node-bootstrapper"
    3. > EOF
  • 生成token码,可以自行生成替换

    1. [root@k8s-master ~]# head -c 16 /dev/urandom | od -An -t x | tr -d ' '
    2. d2251ee6e9f478ef53f768d2873a3a7a
  1. cat > /usr/lib/systemd/system/kube-apiserver.service << EOF
  2. [Unit]
  3. Description=Kubernetes API Server
  4. Documentation=https://github.com/kubernetes/kubernetes
  5. [Service]
  6. EnvironmentFile=/opt/kubernetes/cfg/kube-apiserver.conf
  7. ExecStart=/opt/kubernetes/bin/kube-apiserver \$KUBE_APISERVER_OPTS
  8. Restart=on-failure
  9. [Install]
  10. WantedBy=multi-user.target
  11. EOF
  • 执行管理文件

    1. [root@k8s-master ~]# cat > /usr/lib/systemd/system/kube-apiserver.service << EOF
    2. > [Unit]
    3. > Description=Kubernetes API Server
    4. > Documentation=https://github.com/kubernetes/kubernetes
    5. > [Service]
    6. > EnvironmentFile=/opt/kubernetes/cfg/kube-apiserver.conf
    7. > ExecStart=/opt/kubernetes/bin/kube-apiserver \$KUBE_APISERVER_OPTS
    8. > Restart=on-failure
    9. > [Install]
    10. > WantedBy=multi-user.target
    11. > EOF
  1. systemctl daemon-reload
  2. systemctl start kube-apiserver
  3. systemctl enable kube-apiserver
  • 执行启动apiserver文件

    1. [root@k8s-master ~]# systemctl daemon-reload
    2. [root@k8s-master ~]# systemctl start kube-apiserver
    3. [root@k8s-master ~]# systemctl enable kube-apiserver
    4. Created symlink from /etc/systemd/system/multi-user.target.wants/kube-apiserver.service to /usr/lib/systemd/system/kube-apiserver.service.
  • 验证服务是否启动

    1. [root@k8s-master ~]# netstat -lntup|grep kube-apiserver
    2. tcp 0 0 192.168.0.201:6443 0.0.0.0:* LISTEN 2701/kube-apiserver
    3. tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 2701/kube-apiserver
    4. [root@k8s-master ~]# ps -ef |grep kube-apiserver
    5. root 2701 1 1 16:03 ? 00:01:08 /opt/kubernetes/bin/kube-apiserver --logtostderr=false --v=2 --log-dir=/opt/kubernetes/logs --etcd-servers=https://192.168.0.201:2379,https://192.168.0.202:2379,https://192.168.0.203:2379 --bind-address=192.168.0.201 --secure-port=6443 --advertise-address=192.168.0.201 --allow-privileged=true --service-cluster-ip-range=10.0.0.0/24 --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction --authorization-mode=RBAC,Node --enable-bootstrap-token-auth=true --token-auth-file=/opt/kubernetes/cfg/token.csv --service-node-port-range=30000-32767 --kubelet-client-certificate=/opt/kubernetes/ssl/server.pem --kubelet-client-key=/opt/kubernetes/ssl/server-key.pem --tls-cert-file=/opt/kubernetes/ssl/server.pem --tls-private-key-file=/opt/kubernetes/ssl/server-key.pem --client-ca-file=/opt/kubernetes/ssl/ca.pem --service-account-key-file=/opt/kubernetes/ssl/ca-key.pem --etcd-cafile=/opt/etcd/ssl/ca.pem --etcd-certfile=/opt/etcd/ssl/server.pem --etcd-keyfile=/opt/etcd/ssl/server-key.pem --audit-log-maxage=30 --audit-log-maxbackup=3 --audit-log-maxsize=100 --audit-log-path=/opt/kubernetes/logs/k8s-audit.log
    6. root 2768 2053 0 17:07 pts/0 00:00:00 grep --color=auto kube-apiserver
  1. kubectl create clusterrolebinding kubelet-bootstrap \
  2. --clusterrole=system:node-bootstrapper \
  3. --user=kubelet-bootstrap
  1. cat > /opt/kubernetes/cfg/kube-controller-manager.conf << EOF
  2. KUBE_CONTROLLER_MANAGER_OPTS="--logtostderr=false \\
  3. --v=2 \\
  4. --log-dir=/opt/kubernetes/logs \\
  5. --leader-elect=true \\
  6. --master=127.0.0.1:8080 \\
  7. --bind-address=127.0.0.1 \\
  8. --allocate-node-cidrs=true \\
  9. --cluster-cidr=10.244.0.0/16 \\
  10. --service-cluster-ip-range=10.0.0.0/24 \\
  11. --cluster-signing-cert-file=/opt/kubernetes/ssl/ca.pem \\
  12. --cluster-signing-key-file=/opt/kubernetes/ssl/ca-key.pem \\
  13. --root-ca-file=/opt/kubernetes/ssl/ca.pem \\
  14. --service-account-private-key-file=/opt/kubernetes/ssl/ca-key.pem \\
  15. --experimental-cluster-signing-duration=87600h0m0s"
  16. EOF
  • 注释

    • –master:通过本地非安全本地端口8080连接apiserver。
    • –leader-elect:当该组件启动多个时,自动选举(HA)
    • –cluster-signing-cert-file/–cluster-signing-key-file:自动为kubelet颁发证书的CA,与apiserver保持一致
  • 执行以上配置文件

    1. [root@k8s-master ~]# cat > /opt/kubernetes/cfg/kube-controller-manager.conf << EOF
    2. > KUBE_CONTROLLER_MANAGER_OPTS="--logtostderr=false \\
    3. > --v=2 \\
    4. > --log-dir=/opt/kubernetes/logs \\
    5. > --leader-elect=true \\
    6. > --master=127.0.0.1:8080 \\
    7. > --bind-address=127.0.0.1 \\
    8. > --allocate-node-cidrs=true \\
    9. > --cluster-cidr=10.244.0.0/16 \\
    10. > --service-cluster-ip-range=10.0.0.0/24 \\
    11. > --cluster-signing-cert-file=/opt/kubernetes/ssl/ca.pem \\
    12. > --cluster-signing-key-file=/opt/kubernetes/ssl/ca-key.pem \\
    13. > --root-ca-file=/opt/kubernetes/ssl/ca.pem \\
    14. > --service-account-private-key-file=/opt/kubernetes/ssl/ca-key.pem \\
    15. > --experimental-cluster-signing-duration=87600h0m0s"
    16. > EOF
  1. cat > /usr/lib/systemd/system/kube-controller-manager.service << EOF
  2. [Unit]
  3. Description=Kubernetes Controller Manager
  4. Documentation=https://github.com/kubernetes/kubernetes
  5. [Service]
  6. EnvironmentFile=/opt/kubernetes/cfg/kube-controller-manager.conf
  7. ExecStart=/opt/kubernetes/bin/kube-controller-manager \$KUBE_CONTROLLER_MANAGER_OPTS
  8. Restart=on-failure
  9. [Install]
  10. WantedBy=multi-user.target
  11. EOF
  • 在master执行controller-manager 的systemd管理配置文件

    1. [root@k8s-master ~]# cat > /usr/lib/systemd/system/kube-controller-manager.service << EOF
    2. > [Unit]
    3. > Description=Kubernetes Controller Manager
    4. > Documentation=https://github.com/kubernetes/kubernetes
    5. > [Service]
    6. > EnvironmentFile=/opt/kubernetes/cfg/kube-controller-manager.conf
    7. > ExecStart=/opt/kubernetes/bin/kube-controller-manager \$KUBE_CONTROLLER_MANAGER_OPTS
    8. > Restart=on-failure
    9. > [Install]
    10. > WantedBy=multi-user.target
    11. > EOF
  1. systemctl daemon-reload
  2. systemctl start kube-controller-manager
  3. systemctl enable kube-controller-manager
  • 在master环境执行启动和开机启动

    1. [root@k8s-master ~]# systemctl daemon-reload
    2. [root@k8s-master ~]# systemctl start kube-controller-manager
    3. [root@k8s-master ~]# systemctl enable kube-controller-manager
    4. Created symlink from /etc/systemd/system/multi-user.target.wants/kube-controller-manager.service to /usr/lib/systemd/system/kube-controller-manager.service.
  1. cat > /opt/kubernetes/cfg/kube-scheduler.conf << EOF
  2. KUBE_SCHEDULER_OPTS="--logtostderr=false \
  3. --v=2 \
  4. --log-dir=/opt/kubernetes/logs \
  5. --leader-elect \
  6. --master=127.0.0.1:8080 \
  7. --bind-address=127.0.0.1"
  8. EOF
  • 注释

    • –master:通过本地非安全本地端口8080连接apiserver。
    • –leader-elect:当该组件启动多个时,自动选举(HA)
  • 执行配置文件

    1. [root@k8s-master ~]# cat > /opt/kubernetes/cfg/kube-scheduler.conf << EOF
    2. > KUBE_SCHEDULER_OPTS="--logtostderr=false \
    3. > --v=2 \
    4. > --log-dir=/opt/kubernetes/logs \
    5. > --leader-elect \
    6. > --master=127.0.0.1:8080 \
    7. > --bind-address=127.0.0.1"
    8. > EOF
  1. cat > /usr/lib/systemd/system/kube-scheduler.service << EOF
  2. [Unit]
  3. Description=Kubernetes Scheduler
  4. Documentation=https://github.com/kubernetes/kubernetes
  5. [Service]
  6. EnvironmentFile=/opt/kubernetes/cfg/kube-scheduler.conf
  7. ExecStart=/opt/kubernetes/bin/kube-scheduler \$KUBE_SCHEDULER_OPTS
  8. Restart=on-failure
  9. [Install]
  10. WantedBy=multi-user.target
  11. EOF
  • 执行配置

    1. [root@k8s-master ~]# cat > /usr/lib/systemd/system/kube-scheduler.service << EOF
    2. > [Unit]
    3. > Description=Kubernetes Scheduler
    4. > Documentation=https://github.com/kubernetes/kubernetes
    5. > [Service]
    6. > EnvironmentFile=/opt/kubernetes/cfg/kube-scheduler.conf
    7. > ExecStart=/opt/kubernetes/bin/kube-scheduler \$KUBE_SCHEDULER_OPTS
    8. > Restart=on-failure
    9. > [Install]
    10. > WantedBy=multi-user.target
    11. > EOF
  1. systemctl daemon-reload
  2. systemctl start kube-scheduler
  3. systemctl enable kube-scheduler
  • 执行开机启动

    1. [root@k8s-master ~]# systemctl daemon-reload
    2. [root@k8s-master ~]# systemctl start kube-scheduler
    3. [root@k8s-master ~]# systemctl enable kube-scheduler
    4. Created symlink from /etc/systemd/system/multi-user.target.wants/kube-scheduler.service to /usr/lib/systemd/system/kube-scheduler.service.
  1. [root@k8s-master ~]# kubectl get cs
  2. NAME STATUS MESSAGE ERROR
  3. controller-manager Healthy ok
  4. scheduler Healthy ok
  5. etcd-0 Healthy {"health":"true"}
  6. etcd-2 Healthy {"health":"true"}
  7. etcd-1 Healthy {"health":"true"}
  • 注释

    如上输出说明master节点组件运行正常

下面还是在Master Node上操作,即同时作为Worker Node

在所有worker node创建工作目录:

  1. mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}

从master节点拷贝kubelet kube-proxy配置文件:

  1. [root@k8s-master /]# cd /root/tools/
  2. [root@k8s-master tools]# ll
  3. 总用量 372092
  4. drwxr-xr-x. 3 630384594 600260513 96 11 19 13:59 etcd-v3.4.9-linux-amd64
  5. -rw-r--r--. 1 root root 17364053 11 17 21:09 etcd-v3.4.9-linux-amd64.tar.gz
  6. drwxr-xr-x. 4 root root 79 5 20 2020 kubernetes
  7. -rw-r--r--. 1 root root 363654483 11 19 21:41 kubernetes-server-linux-amd64.tar.gz
  8. [root@k8s-master tools]# cd kubernetes/server/bin/
  9. [root@k8s-master bin]# ll
  10. 总用量 1087376
  11. -rwxr-xr-x. 1 root root 48128000 5 20 2020 apiextensions-apiserver
  12. -rwxr-xr-x. 1 root root 39813120 5 20 2020 kubeadm
  13. -rwxr-xr-x. 1 root root 120668160 5 20 2020 kube-apiserver
  14. -rw-r--r--. 1 root root 8 5 20 2020 kube-apiserver.docker_tag
  15. -rw-------. 1 root root 174558720 5 20 2020 kube-apiserver.tar
  16. -rwxr-xr-x. 1 root root 110059520 5 20 2020 kube-controller-manager
  17. -rw-r--r--. 1 root root 8 5 20 2020 kube-controller-manager.docker_tag
  18. -rw-------. 1 root root 163950080 5 20 2020 kube-controller-manager.tar
  19. -rwxr-xr-x. 1 root root 44032000 5 20 2020 kubectl
  20. -rwxr-xr-x. 1 root root 113283800 5 20 2020 kubelet
  21. -rwxr-xr-x. 1 root root 38379520 5 20 2020 kube-proxy
  22. -rw-r--r--. 1 root root 8 5 20 2020 kube-proxy.docker_tag
  23. -rw-------. 1 root root 119099392 5 20 2020 kube-proxy.tar
  24. -rwxr-xr-x. 1 root root 42950656 5 20 2020 kube-scheduler
  25. -rw-r--r--. 1 root root 8 5 20 2020 kube-scheduler.docker_tag
  26. -rw-------. 1 root root 96841216 5 20 2020 kube-scheduler.tar
  27. -rwxr-xr-x. 1 root root 1687552 5 20 2020 mounter
  28. [root@k8s-master bin]# cp -a kubelet kube-proxy /opt/kubernetes/bin/ # 本地拷贝
  1. cat > /opt/kubernetes/cfg/kubelet.conf << EOF
  2. KUBELET_OPTS="--logtostderr=false \\
  3. --v=2 \\
  4. --log-dir=/opt/kubernetes/logs \\
  5. --hostname-override=k8s-master \\
  6. --network-plugin=cni \\
  7. --kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \\
  8. --bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \\
  9. --config=/opt/kubernetes/cfg/kubelet-config.yml \\
  10. --cert-dir=/opt/kubernetes/ssl \\
  11. --pod-infra-container-image=lizhenliang/pause-amd64:3.0"
  12. EOF
  • 注释

    • –hostname-override:显示名称,集群中唯一
    • –network-plugin:启用CNI
    • –kubeconfig:空路径,会自动生成,后面用于连接apiserver
    • –bootstrap-kubeconfig:首次启动向apiserver申请证书
    • –config:配置参数文件
    • –cert-dir:kubelet证书生成目录
    • –pod-infra-container-image:管理Pod网络容器的镜像
  • 执行配置文件

    1. [root@k8s-master bin]# cat > /opt/kubernetes/cfg/kubelet.conf << EOF
    2. > KUBELET_OPTS="--logtostderr=false \\
    3. > --v=2 \\
    4. > --log-dir=/opt/kubernetes/logs \\
    5. > --hostname-override=k8s-master \\
    6. > --network-plugin=cni \\
    7. > --kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \\
    8. > --bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \\
    9. > --config=/opt/kubernetes/cfg/kubelet-config.yml \\
    10. > --cert-dir=/opt/kubernetes/ssl \\
    11. > --pod-infra-container-image=lizhenliang/pause-amd64:3.0"
    12. > EOF
  1. cat > /opt/kubernetes/cfg/kubelet-config.yml << EOF
  2. kind: KubeletConfiguration
  3. apiVersion: kubelet.config.k8s.io/v1beta1
  4. address: 0.0.0.0
  5. port: 10250
  6. readOnlyPort: 10255
  7. cgroupDriver: cgroupfs
  8. clusterDNS:
  9. - 10.0.0.2
  10. clusterDomain: cluster.local
  11. failSwapOn: false
  12. authentication:
  13. anonymous:
  14. enabled: false
  15. webhook:
  16. cacheTTL: 2m0s
  17. enabled: true
  18. x509:
  19. clientCAFile: /opt/kubernetes/ssl/ca.pem
  20. authorization:
  21. mode: Webhook
  22. webhook:
  23. cacheAuthorizedTTL: 5m0s
  24. cacheUnauthorizedTTL: 30s
  25. evictionHard:
  26. imagefs.available: 15%
  27. memory.available: 100Mi
  28. nodefs.available: 10%
  29. nodefs.inodesFree: 5%
  30. maxOpenFiles: 1000000
  31. maxPods: 110
  32. EOF
  • 执行配置文件

    1. [root@k8s-master kubernetes]# cat > /opt/kubernetes/cfg/kubelet-config.yml << EOF
    2. > kind: KubeletConfiguration
    3. > apiVersion: kubelet.config.k8s.io/v1beta1
    4. > address: 0.0.0.0
    5. > port: 10250
    6. > readOnlyPort: 10255
    7. > cgroupDriver: cgroupfs
    8. > clusterDNS:
    9. > - 10.0.0.2
    10. > clusterDomain: cluster.local
    11. > failSwapOn: false
    12. > authentication:
    13. > anonymous:
    14. > enabled: false
    15. > webhook:
    16. > cacheTTL: 2m0s
    17. > enabled: true
    18. > x509:
    19. > clientCAFile: /opt/kubernetes/ssl/ca.pem
    20. > authorization:
    21. > mode: Webhook
    22. > webhook:
    23. > cacheAuthorizedTTL: 5m0s
    24. > cacheUnauthorizedTTL: 30s
    25. > evictionHard:
    26. > imagefs.available: 15%
    27. > memory.available: 100Mi
    28. > nodefs.available: 10%
    29. > nodefs.inodesFree: 5%
    30. > maxOpenFiles: 1000000
    31. > maxPods: 110
    32. > EOF
  • 创建bootstrap-kubeconfig.sh脚本

    1. [root@k8s-master kubernetes]# cd ~
    2. [root@k8s-master ~]# ll
    3. 总用量 4
    4. drwxr-xr-x. 2 root root 6 11 17 20:39 -
    5. -rw-------. 1 root root 1658 11 11 05:16 anaconda-ks.cfg
    6. drwxr-xr-x. 2 root root 6 11 17 20:52 cfssl
    7. drwxr-xr-x. 5 root root 46 11 19 20:59 TLS
    8. drwxr-xr-x. 4 root root 137 11 19 21:46 tools
    9. [root@k8s-master ~]# vim bootstrap-kubeconfig.sh
    10. [root@k8s-master ~]# cat bootstrap-kubeconfig.sh
    11. #!/bin/bash
    12. KUBE_APISERVER="https://192.168.0.201:6443" # apiserver IP:PORT
    13. TOKEN="c47ffb939f5ca36231d9e3121a252940" # 与token.csv里保持一致
    14. # 生成 kubelet bootstrap kubeconfig 配置文件
    15. kubectl config set-cluster kubernetes \
    16. --certificate-authority=/opt/kubernetes/ssl/ca.pem \
    17. --embed-certs=true \
    18. --server=${KUBE_APISERVER} \
    19. --kubeconfig=bootstrap.kubeconfig
    20. kubectl config set-credentials "kubelet-bootstrap" \
    21. --token=${TOKEN} \
    22. --kubeconfig=bootstrap.kubeconfig
    23. kubectl config set-context default \
    24. --cluster=kubernetes \
    25. --user="kubelet-bootstrap" \
    26. --kubeconfig=bootstrap.kubeconfig
    27. kubectl config use-context default --kubeconfig=bootstrap.kubeconfig
  • 执行脚本,生成bootstrap-kubeconfig配置文件

    1. [root@k8s-master ~]# sh bootstrap-kubeconfig.sh
    2. Cluster "kubernetes" set.
    3. User "kubelet-bootstrap" set.
    4. Context "default" created.
    5. Switched to context "default".
    6. [root@k8s-master ~]# ll
    7. 总用量 12
    8. drwxr-xr-x. 2 root root 6 11 17 20:39 -
    9. -rw-------. 1 root root 1658 11 11 05:16 anaconda-ks.cfg
    10. -rw------- 1 root root 2167 11 23 21:51 bootstrap.kubeconfig
    11. -rw-r--r-- 1 root root 693 11 23 21:50 bootstrap-kubeconfig.sh
    12. drwxr-xr-x. 2 root root 6 11 17 20:52 cfssl
    13. drwxr-xr-x. 5 root root 46 11 19 20:59 TLS
    14. drwxr-xr-x. 4 root root 137 11 19 21:46 tools
  • 拷贝bootstrap.kubeconfig

    1. [root@k8s-master ~]# cp -a bootstrap.kubeconfig /opt/kubernetes/cfg/
  1. cat > /usr/lib/systemd/system/kubelet.service << EOF
  2. [Unit]
  3. Description=Kubernetes Kubelet
  4. After=docker.service
  5. [Service]
  6. EnvironmentFile=/opt/kubernetes/cfg/kubelet.conf
  7. ExecStart=/opt/kubernetes/bin/kubelet \$KUBELET_OPTS
  8. Restart=on-failure
  9. LimitNOFILE=65536
  10. [Install]
  11. WantedBy=multi-user.target
  12. EOF
  • 执行配置文件

    1. [root@k8s-master ~]# cat > /usr/lib/systemd/system/kubelet.service << EOF
    2. > [Unit]
    3. > Description=Kubernetes Kubelet
    4. > After=docker.service
    5. > [Service]
    6. > EnvironmentFile=/opt/kubernetes/cfg/kubelet.conf
    7. > ExecStart=/opt/kubernetes/bin/kubelet \$KUBELET_OPTS
    8. > Restart=on-failure
    9. > LimitNOFILE=65536
    10. > [Install]
    11. > WantedBy=multi-user.target
    12. > EOF
  1. systemctl daemon-reload
  2. systemctl start kubelet
  3. systemctl enable kubelet
  • 执行启动

    1. [root@k8s-master ~]# systemctl daemon-reload
    2. [root@k8s-master ~]# systemctl start kubelet
    3. [root@k8s-master ~]# systemctl enable kubelet
    4. Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
  1. # 查看kubelet证书请求
  2. [root@k8s-master ~]# kubectl get csr
  3. NAME AGE SIGNERNAME REQUESTOR CONDITION
  4. node-csr-EDYoKN4sH6vlVUx7HrCH7i1lBMDTqNiTx9oRU3e3xM4 2m4s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending
  5. # 批准申请
  6. [root@k8s-master ~]# kubectl certificate approve node-csr-EDYoKN4sH6vlVUx7HrCH7i1lBMDTqNiTx9oRU3e3xM4
  7. certificatesigningrequest.certificates.k8s.io/node-csr-EDYoKN4sH6vlVUx7HrCH7i1lBMDTqNiTx9oRU3e3xM4 approved
  8. # 查看节点
  9. [root@k8s-master ~]# kubectl get node
  10. NAME STATUS ROLES AGE VERSION
  11. k8s-master NotReady <none> 17s v1.18.3
  1. cat > /opt/kubernetes/cfg/kube-proxy.conf << EOF
  2. KUBE_PROXY_OPTS="--logtostderr=false \\
  3. --v=2 \\
  4. --log-dir=/opt/kubernetes/logs \\
  5. --config=/opt/kubernetes/cfg/kube-proxy-config.yml"
  6. EOF
  • 执行配置

    1. [root@k8s-master ~]# cat > /opt/kubernetes/cfg/kube-proxy.conf << EOF
    2. > KUBE_PROXY_OPTS="--logtostderr=false \\
    3. > --v=2 \\
    4. > --log-dir=/opt/kubernetes/logs \\
    5. > --config=/opt/kubernetes/cfg/kube-proxy-config.yml"
    6. > EOF
  1. cat > /opt/kubernetes/cfg/kube-proxy-config.yml << EOF
  2. kind: KubeProxyConfiguration
  3. apiVersion: kubeproxy.config.k8s.io/v1alpha1
  4. bindAddress: 0.0.0.0
  5. metricsBindAddress: 0.0.0.0:10249
  6. clientConnection:
  7. kubeconfig: /opt/kubernetes/cfg/kube-proxy.kubeconfig
  8. hostnameOverride: k8s-master
  9. clusterCIDR: 10.0.0.0/24
  10. EOF
  • 执行配置

    1. [root@k8s-master ~]# cat > /opt/kubernetes/cfg/kube-proxy-config.yml << EOF
    2. > kind: KubeProxyConfiguration
    3. > apiVersion: kubeproxy.config.k8s.io/v1alpha1
    4. > bindAddress: 0.0.0.0
    5. > metricsBindAddress: 0.0.0.0:10249
    6. > clientConnection:
    7. > kubeconfig: /opt/kubernetes/cfg/kube-proxy.kubeconfig
    8. > hostnameOverride: k8s-master
    9. > clusterCIDR: 10.0.0.0/24
    10. > EOF
  1. #切换到apiserver的目录下
  2. [root@k8s-master ~]# cd /root/TLS/apiserver/
  3. # 创建证书请求文件
  4. cat > kube-proxy-csr.json << EOF
  5. {
  6. "CN": "system:kube-proxy",
  7. "hosts": [],
  8. "key": {
  9. "algo": "rsa",
  10. "size": 2048
  11. },
  12. "names": [
  13. {
  14. "C": "CN",
  15. "L": "BeiJing",
  16. "ST": "BeiJing",
  17. "O": "k8s",
  18. "OU": "System"
  19. }
  20. ]
  21. }
  22. EOF
  23. # 生成证书
  24. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
  25. # 查看证书
  26. ls kube-proxy*pem
  • 执行配置

    1. [root@k8s-master ~]# cd /root/TLS/apiserver/
    2. [root@k8s-master apiserver]# ll
    3. 总用量 36
    4. -rw-r--r--. 1 root root 294 11 19 21:00 ca-config.json
    5. -rw-r--r--. 1 root root 1001 11 19 21:02 ca.csr
    6. -rw-r--r--. 1 root root 264 11 19 21:00 ca-csr.json
    7. -rw-------. 1 root root 1675 11 19 21:02 ca-key.pem
    8. -rw-r--r--. 1 root root 1359 11 19 21:02 ca.pem
    9. -rw-r--r--. 1 root root 1261 11 19 21:16 server.csr
    10. -rw-r--r--. 1 root root 557 11 19 21:10 server-csr.json
    11. -rw-------. 1 root root 1679 11 19 21:16 server-key.pem
    12. -rw-r--r--. 1 root root 1627 11 19 21:16 server.pem
    13. [root@k8s-master apiserver]# cat > kube-proxy-csr.json << EOF
    14. > {
    15. > "CN": "system:kube-proxy",
    16. > "hosts": [],
    17. > "key": {
    18. > "algo": "rsa",
    19. > "size": 2048
    20. > },
    21. > "names": [
    22. > {
    23. > "C": "CN",
    24. > "L": "BeiJing",
    25. > "ST": "BeiJing",
    26. > "O": "k8s",
    27. > "OU": "System"
    28. > }
    29. > ]
    30. > }
    31. > EOF
  • 执行证书生成命令

    1. [root@k8s-master apiserver]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
    2. 2020/11/23 22:16:56 [INFO] generate received request
    3. 2020/11/23 22:16:56 [INFO] received CSR
    4. 2020/11/23 22:16:56 [INFO] generating key: rsa-2048
    5. 2020/11/23 22:16:57 [INFO] encoded CSR
    6. 2020/11/23 22:16:57 [INFO] signed certificate with serial number 135691991395151702368398150414714985360518061883
    7. 2020/11/23 22:16:57 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
    8. websites. For more information see the Baseline Requirements for the Issuance and Management
    9. of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
    10. specifically, section 10.2.3 ("Information Requirements").
  • 查看证书

    1. [root@k8s-master apiserver]# ls kube-proxy*pem
    2. kube-proxy-key.pem kube-proxy.pem
  • 创建kubeconfig.sh脚本

    1. [root@k8s-master ~]# vim kubeconfig.sh
    2. [root@k8s-master ~]# cat kubeconfig.sh
    3. #!/bin/bash
    4. KUBE_APISERVER="https://192.168.0.201:6443" #修改本地ip地址
    5. kubectl config set-cluster kubernetes \
    6. --certificate-authority=/opt/kubernetes/ssl/ca.pem \
    7. --embed-certs=true \
    8. --server=${KUBE_APISERVER} \
    9. --kubeconfig=kube-proxy.kubeconfig
    10. kubectl config set-credentials kube-proxy \
    11. --client-certificate=./kube-proxy.pem \
    12. --client-key=./kube-proxy-key.pem \
    13. --embed-certs=true \
    14. --kubeconfig=kube-proxy.kubeconfig
    15. kubectl config set-context default \
    16. --cluster=kubernetes \
    17. --user=kube-proxy \
    18. --kubeconfig=kube-proxy.kubeconfig
    19. kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
  • 执行脚本

    1. [root@k8s-master ~]# sh kubeconfig.sh
    2. Cluster "kubernetes" set.
    3. error: error reading client-certificate data from ./kube-proxy.pem: open ./kube-proxy.pem: no such file or directory
    4. Context "default" created.
    5. Switched to context "default".
  • 拷贝配置文件kube-proxy.kubeconfig

    1. [root@k8s-master ~]# cp -a kube-proxy.kubeconfig /opt/kubernetes/cfg/
  1. cat > /usr/lib/systemd/system/kube-proxy.service << EOF
  2. [Unit]
  3. Description=Kubernetes Proxy
  4. After=network.target
  5. [Service]
  6. EnvironmentFile=/opt/kubernetes/cfg/kube-proxy.conf
  7. ExecStart=/opt/kubernetes/bin/kube-proxy \$KUBE_PROXY_OPTS
  8. Restart=on-failure
  9. LimitNOFILE=65536
  10. [Install]
  11. WantedBy=multi-user.target
  12. EOF
  • 执行配置

    1. [root@k8s-master ~]# cat > /usr/lib/systemd/system/kube-proxy.service << EOF
    2. > [Unit]
    3. > Description=Kubernetes Proxy
    4. > After=network.target
    5. > [Service]
    6. > EnvironmentFile=/opt/kubernetes/cfg/kube-proxy.conf
    7. > ExecStart=/opt/kubernetes/bin/kube-proxy \$KUBE_PROXY_OPTS
    8. > Restart=on-failure
    9. > LimitNOFILE=65536
    10. > [Install]
    11. > WantedBy=multi-user.target
    12. > EOF
  1. systemctl daemon-reload
  2. systemctl start kube-proxy
  3. systemctl enable kube-proxy
  • 执行启动并设置开机启动

    1. [root@k8s-master ~]# systemctl daemon-reload
    2. [root@k8s-master ~]# systemctl start kube-proxy
    3. [root@k8s-master ~]# systemctl enable kube-proxy
    4. Created symlink from /etc/systemd/system/multi-user.target.wants/kube-proxy.service to /usr/lib/systemd/system/kube-proxy.service.
  1. [root@k8s-master ~]# cd /root/tools/
  2. [root@k8s-master tools]# ll
  3. 总用量 372092
  4. drwxr-xr-x. 3 630384594 600260513 96 11 19 13:59 etcd-v3.4.9-linux-amd64
  5. -rw-r--r--. 1 root root 17364053 11 17 21:09 etcd-v3.4.9-linux-amd64.tar.gz
  6. drwxr-xr-x. 4 root root 79 5 20 2020 kubernetes
  7. -rw-r--r--. 1 root root 363654483 11 19 21:41 kubernetes-server-linux-amd64.tar.gz
  8. [root@k8s-master tools]# wget https://github.com/containernetworking/plugins/releases/download/v0.8.6/cni-plugins-linux-amd64-v0.8.6.tgz
  9. [root@k8s-master tools]# ll
  10. 总用量 408108
  11. -rw-r--r-- 1 root root 36878412 11 24 12:55 cni-plugins-linux-amd64-v0.8.6.tgz
  12. drwxr-xr-x. 3 630384594 600260513 96 11 19 13:59 etcd-v3.4.9-linux-amd64
  13. -rw-r--r--. 1 root root 17364053 11 17 21:09 etcd-v3.4.9-linux-amd64.tar.gz
  14. drwxr-xr-x. 4 root root 79 5 20 2020 kubernetes
  15. -rw-r--r--. 1 root root 363654483 11 19 21:41 kubernetes-server-linux-amd64.tar.gz
  1. [root@k8s-master tools]# mkdir -p /opt/cni/bin
  2. [root@k8s-master tools]# tar -zxvf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin/
  3. ./
  4. ./flannel
  5. ./ptp
  6. ./host-local
  7. ./firewall
  8. ./portmap
  9. ./tuning
  10. ./vlan
  11. ./host-device
  12. ./bandwidth
  13. ./sbr
  14. ./static
  15. ./dhcp
  16. ./ipvlan
  17. ./macvlan
  18. ./loopback
  19. ./bridge
  1. [root@k8s-master tools]# cd /root
  2. [root@k8s-master ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  3. [root@k8s-master ~]# sed -i -r "s#quay.io/coreos/flannel:.*-amd64#lizhenliang/flannel:v0.12.0-amd64#g" kube-flannel.yml
  • 注释:默认镜像地址无法访问,修改为docker hub镜像仓库
  1. # 部署插件
  2. kubectl apply -f kube-flannel.yml
  3. # 查询插件
  4. kubectl get pods -n kube-system
  5. NAME READY STATUS RESTARTS AGE
  6. kube-flannel-ds-amd64-2pc95 1/1 Running 0 72s
  7. # 查询node
  8. kubectl get node
  9. NAME STATUS ROLES AGE VERSION
  10. k8s-master Ready <none> 41m v1.18.3

部署好网络插件,Node准备就绪。

  1. cat > apiserver-to-kubelet-rbac.yaml << EOF
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. kind: ClusterRole
  4. metadata:
  5. annotations:
  6. rbac.authorization.kubernetes.io/autoupdate: "true"
  7. labels:
  8. kubernetes.io/bootstrapping: rbac-defaults
  9. name: system:kube-apiserver-to-kubelet
  10. rules:
  11. - apiGroups:
  12. - ""
  13. resources:
  14. - nodes/proxy
  15. - nodes/stats
  16. - nodes/log
  17. - nodes/spec
  18. - nodes/metrics
  19. - pods/log
  20. verbs:
  21. - "*"
  22. ---
  23. apiVersion: rbac.authorization.k8s.io/v1
  24. kind: ClusterRoleBinding
  25. metadata:
  26. name: system:kube-apiserver
  27. namespace: ""
  28. roleRef:
  29. apiGroup: rbac.authorization.k8s.io
  30. kind: ClusterRole
  31. name: system:kube-apiserver-to-kubelet
  32. subjects:
  33. - apiGroup: rbac.authorization.k8s.io
  34. kind: User
  35. name: kubernetes
  36. EOF
  37. # 执行配置文件
  38. kubectl apply -f apiserver-to-kubelet-rbac.yaml
  • 执行配置文件

    1. [root@k8s-master ~]# cat > apiserver-to-kubelet-rbac.yaml << EOF
    2. > apiVersion: rbac.authorization.k8s.io/v1
    3. > kind: ClusterRole
    4. > metadata:
    5. > annotations:
    6. > rbac.authorization.kubernetes.io/autoupdate: "true"
    7. > labels:
    8. > kubernetes.io/bootstrapping: rbac-defaults
    9. > name: system:kube-apiserver-to-kubelet
    10. > rules:
    11. > - apiGroups:
    12. > - ""
    13. > resources:
    14. > - nodes/proxy
    15. > - nodes/stats
    16. > - nodes/log
    17. > - nodes/spec
    18. > - nodes/metrics
    19. > - pods/log
    20. > verbs:
    21. > - "*"
    22. > ---
    23. > apiVersion: rbac.authorization.k8s.io/v1
    24. > kind: ClusterRoleBinding
    25. > metadata:
    26. > name: system:kube-apiserver
    27. > namespace: ""
    28. > roleRef:
    29. > apiGroup: rbac.authorization.k8s.io
    30. > kind: ClusterRole
    31. > name: system:kube-apiserver-to-kubelet
    32. > subjects:
    33. > - apiGroup: rbac.authorization.k8s.io
    34. > kind: User
    35. > name: kubernetes
    36. > EOF
  • 执行配置文件生成

    1. [root@k8s-master ~]# kubectl apply -f apiserver-to-kubelet-rbac.yaml
    2. clusterrole.rbac.authorization.k8s.io/system:kube-apiserver-to-kubelet created
    3. clusterrolebinding.rbac.authorization.k8s.io/system:kube-apiserver created
  1. [root@k8s-master ~]# scp -r /opt/kubernetes root@192.168.0.202:/opt
  2. [root@k8s-master ~]# scp -r /usr/lib/systemd/system/{kubelet,kube-proxy}.service root@192.168.0.202:/usr/lib/systemd/system
  3. [root@k8s-master ~]# scp -r /opt/kubernetes root@192.168.0.203:/opt
  4. [root@k8s-master ~]# scp -r /usr/lib/systemd/system/{kubelet,kube-proxy}.service root@192.168.0.203:/usr/lib/systemd/system
  1. [root@k8s-node1 ~]# rm -f /opt/kubernetes/cfg/kubelet.kubeconfig
  2. [root@k8s-node1 ~]# rm -f /opt/kubernetes/ssl/kubelet*
  3. [root@k8s-node2 ~]# rm -f /opt/kubernetes/cfg/kubelet.kubeconfig
  4. [root@k8s-node2 ~]# rm -f /opt/kubernetes/ssl/kubelet*
  1. [root@k8s-node1 ~]# vim /opt/kubernetes/cfg/kubelet.conf
  2. [root@k8s-node1 ~]# cat /opt/kubernetes/cfg/kubelet.conf
  3. --hostname-override=k8s-master
  4. # 把上面的修改为下面这种
  5. --hostname-override=k8s-node1
  6. [root@k8s-node2 ~]# vim /opt/kubernetes/cfg/kubelet.conf
  7. [root@k8s-node2 ~]# cat /opt/kubernetes/cfg/kubelet.conf
  8. --hostname-override=k8s-master
  9. # 把上面的修改为下面这种
  10. --hostname-override=k8s-node2
  1. systemctl daemon-reload
  2. systemctl start kubelet
  3. systemctl enable kubelet
  4. systemctl start kube-proxy
  5. systemctl enable kube-proxy
  • 在k8s-node1上执行

    1. [root@k8s-node1 ~]# systemctl daemon-reload
    2. [root@k8s-node1 ~]# systemctl start kubelet
    3. [root@k8s-node1 ~]# systemctl enable kubelet
    4. Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
    5. [root@k8s-node1 ~]# systemctl start kube-proxy
    6. [root@k8s-node1 ~]# systemctl enable kube-proxy
    7. Created symlink from /etc/systemd/system/multi-user.target.wants/kube-proxy.service to /usr/lib/systemd/system/kube-proxy.service.
  • 在k8s-node2上执行

    1. [root@k8s-node2 ~]# systemctl daemon-reload
    2. [root@k8s-node2 ~]# systemctl start kubelet
    3. [root@k8s-node2 ~]# systemctl enable kubelet
    4. Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
    5. [root@k8s-node2 ~]# systemctl start kube-proxy
    6. [root@k8s-node2 ~]# systemctl enable kube-proxy
    7. Created symlink from /etc/systemd/system/multi-user.target.wants/kube-proxy.service to /usr/lib/systemd/system/kube-proxy.service.
  1. # 查看kubelet证书申请
  2. [root@k8s-master ~]# kubectl get csr
  3. NAME AGE SIGNERNAME REQUESTOR CONDITION
  4. node-csr-dtumcoSnXgyUaZCgSflcsFXHx4dkXLwN9RHZispUKb8 34s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending
  5. node-csr-oLimBxMuWXYX0e0o0ddQ66n4er3niq7hRWHF7NXx6b8 28s kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending
  6. # 批准申请
  7. [root@k8s-master ~]# kubectl certificate approve node-csr-dtumcoSnXgyUaZCgSflcsFXHx4dkXLwN9RHZispUKb8
  8. certificatesigningrequest.certificates.k8s.io/node-csr-dtumcoSnXgyUaZCgSflcsFXHx4dkXLwN9RHZispUKb8 approved
  9. [root@k8s-master ~]# kubectl certificate approve node-csr-oLimBxMuWXYX0e0o0ddQ66n4er3niq7hRWHF7NXx6b8
  10. certificatesigningrequest.certificates.k8s.io/node-csr-oLimBxMuWXYX0e0o0ddQ66n4er3niq7hRWHF7NXx6b8 approved
  11. # 查询node节点
  12. [root@k8s-master ~]# kubectl get node
  13. NAME STATUS ROLES AGE VERSION
  14. k8s-master Ready <none> 20h v1.18.3
  15. k8s-node1 NotReady <none> 32s v1.18.3
  16. k8s-node2 NotReady <none> 19s v1.18.3

版权声明:本文为scajy原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/scajy/p/14383863.html