etcd集群

配置各个节点/etc/hosts

[root@host-10-10-18-42 etcd]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
etcd1   10.10.18.42
etcd2   10.10.18.43
etcd3   10.10.18.44
etcd1
10.10.18.42
etcd2
10.10.18.43
etcd3
10.10.18.44

配置目录

   mkdir /data/k8s/etcd/{data,wal} -p
   chown -R etcd.etcd /data/k8s/etcd

etcd1

[root@host-10-10-18-42 etcd]# cat etcd.conf
ETCD_DATA_DIR="/data/k8s/etcd/data"
ETCD_WAL_DIR="/data/k8s/etcd/wal"
ETCD_LISTEN_PEER_URLS="http://10.10.18.42:2380"
ETCD_LISTEN_CLIENT_URLS="http://10.10.18.42:2379"
ETCD_MAX_SNAPSHOTS="5"
ETCD_MAX_WALS="5"
ETCD_NAME="etcd1"
ETCD_SNAPSHOT_COUNT="100000"
ETCD_HEARTBEAT_INTERVAL="100"
ETCD_ELECTION_TIMEOUT="1000"

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.10.18.42:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://10.10.18.42:2379"

ETCD_INITIAL_CLUSTER="etcd1=http://10.10.18.42:2380,etcd2=http://10.10.18.43:2380,etcd3=http://10.10.18.44:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"

etcd2

[root@host-10-10-18-43 etcd]# cat etcd.conf 
ETCD_DATA_DIR="/data/k8s/etcd/data"
ETCD_WAL_DIR="/data/k8s/etcd/wal"
ETCD_LISTEN_PEER_URLS="http://10.10.18.43:2380"
ETCD_LISTEN_CLIENT_URLS="http://10.10.18.43:2379"
ETCD_MAX_SNAPSHOTS="5"
ETCD_MAX_WALS="5"
ETCD_NAME="etcd2"
ETCD_SNAPSHOT_COUNT="100000"
ETCD_HEARTBEAT_INTERVAL="100"
ETCD_ELECTION_TIMEOUT="1000"

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.10.18.43:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://10.10.18.43:2379"

ETCD_INITIAL_CLUSTER="etcd1=http://10.10.18.42:2380,etcd2=http://10.10.18.43:2380,etcd3=http://10.10.18.44:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"

etcd3

[root@host-10-10-18-44 etcd]# cat etcd.conf
ETCD_DATA_DIR="/data/k8s/etcd/data"
ETCD_WAL_DIR="/data/k8s/etcd/wal"
ETCD_LISTEN_PEER_URLS="http://10.10.18.44:2380"
ETCD_LISTEN_CLIENT_URLS="http://10.10.18.44:2379"
ETCD_MAX_SNAPSHOTS="5"
ETCD_MAX_WALS="5"
ETCD_NAME="etcd3"
ETCD_SNAPSHOT_COUNT="100000"
ETCD_HEARTBEAT_INTERVAL="100"
ETCD_ELECTION_TIMEOUT="1000"

ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.10.18.44:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://10.10.18.44:2379"

ETCD_INITIAL_CLUSTER="etcd1=http://10.10.18.42:2380,etcd2=http://10.10.18.43:2380,etcd3=http://10.10.18.44:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
Jun 29 11:28:03 host-10-10-18-43 etcd[4059]: health check for peer 1829ea2c82ecd13e could not connect: dial tcp 10.10.18.42:2380: i/o timeout (prober "ROUND_TRIPPER_RAFT_MESSAGE")
Jun 29 11:28:03 host-10-10-18-43 etcd[4059]: health check for peer 1829ea2c82ecd13e could not connect: dial tcp 10.10.18.42:2380: i/o timeout (prober "ROUND_TRIPPER_SNAPSHOT")
Jun 29 11:28:03 host-10-10-18-43 etcd[4059]: health check for peer fe3b541533812c5d could not connect: dial tcp 10.10.18.44:2380: i/o timeout (prober "ROUND_TRIPPER_RAFT_MESSAGE")
Jun 29 11:28:03 host-10-10-18-43 etcd[4059]: health check for peer fe3b541533812c5d could not connect: dial tcp 10.10.18.44:2380: i/o timeout (prober "ROUND_TRIPPER_SNAPSHOT")
root@ubuntu:~/bibili# telnet 10.10.18.44 2380
Trying 10.10.18.44...
telnet: Unable to connect to remote host: No route to host
root@ubuntu:~/bibili# 

关闭CentOS7防火墙

复制代码
# 查看防火墙状态
firewall-cmd --state

# 停止firewall
systemctl stop firewalld.service

# 禁止firewall开机启动
systemctl disable firewalld.service
复制代码

关闭SELINUX

# 编辑SELINUX文件
vim /etc/selinux/config

# 将SELINUX=enforcing改为SELINUX=disabled
root@ubuntu:~/bibili# telnet 10.10.18.44 2380
Trying 10.10.18.44...
Connected to 10.10.18.44.
Escape character is '^]'.
^C^C^CConnection closed by foreign host.
root@ubuntu:~/etcd-v3.5.0-linux-arm64#  ETCDCTL_API=3 etcdctl --endpoints=http://10.10.18.42:2379,http://10.10.18.43:2379,http://10.10.18.44:2379 endpoint health
http://10.10.18.43:2379 is healthy: successfully committed proposal: took = 2.311413ms
http://10.10.18.42:2379 is healthy: successfully committed proposal: took = 4.239303ms
http://10.10.18.44:2379 is healthy: successfully committed proposal: took = 4.742326ms
root@ubuntu:~/etcd-v3.5.0-linux-arm64# 
root@ubuntu:~/etcd-v3.5.0-linux-arm64#  ETCDCTL_API=3 ./etcdctl --endpoints=http://10.10.18.42:2379,http://10.10.18.43:2379,http://10.10.18.44:2379  member list
1829ea2c82ecd13e, started, etcd1, http://10.10.18.42:2380, http://10.10.18.42:2379, false
19ddebfcb3e299fd, started, etcd2, http://10.10.18.43:2380, http://10.10.18.43:2379, false
fe3b541533812c5d, started, etcd3, http://10.10.18.44:2380, http://10.10.18.44:2379, false
root@ubuntu:~/etcd-v3.5.0-linux-arm64#  ETCDCTL_API=3 ./etcdctl -w table  --endpoints=http://10.10.18.42:2379,http://10.10.18.43:2379,http://10.10.18.44:2379 endpoint  status
+-------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
|        ENDPOINT         |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+-------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| http://10.10.18.42:2379 | 1829ea2c82ecd13e |  3.3.11 |  328 kB |      true |      false |       339 |         17 |                  0 |        |
| http://10.10.18.43:2379 | 19ddebfcb3e299fd |  3.3.11 |  328 kB |     false |      false |       339 |         17 |                  0 |        |
| http://10.10.18.44:2379 | fe3b541533812c5d |  3.3.11 |  328 kB |     false |      false |       339 |         17 |                  0 |        |
+-------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
root@ubuntu:~/etcd-v3.5.0-linux-arm64# 
root@ubuntu:~/etcd-v3.5.0-linux-arm64# ENDPOINTS=http://10.10.18.42:2379,http://10.10.18.43:2379,http://10.10.18.44:2379
 
root@ubuntu:~/etcd-v3.5.0-linux-arm64#  ETCDCTL_API=3 ./etcdctl -w table  --endpoints=$ENDPOINTS endpoint  status
+-------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
|        ENDPOINT         |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+-------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| http://10.10.18.42:2379 | 1829ea2c82ecd13e |  3.3.11 |  328 kB |      true |      false |       339 |         17 |                  0 |        |
| http://10.10.18.43:2379 | 19ddebfcb3e299fd |  3.3.11 |  328 kB |     false |      false |       339 |         17 |                  0 |        |
| http://10.10.18.44:2379 | fe3b541533812c5d |  3.3.11 |  328 kB |     false |      false |       339 |         17 |                  0 |        |
+-------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
root@ubuntu:~/etcd-v3.5.0-linux-arm64# 
root@ubuntu:~/etcd-v3.5.0-linux-arm64#  ETCDCTL_API=3 ./etcdctl   --endpoints=$ENDPOINTS  put test "helloworld"
OK
root@ubuntu:~/etcd-v3.5.0-linux-arm64#  ETCDCTL_API=3 ./etcdctl   --endpoints=$ENDPOINTS  get test
test
helloworld
root@ubuntu:~/etcd-v3.5.0-linux-arm64# 
[root@host-10-10-18-42 etcd]# tree  /data/k8s/etcd/
/data/k8s/etcd/
|-- data
|   `-- member
|       `-- snap
|           `-- db
`-- wal
    |-- 0000000000000000-0000000000000000.wal
    `-- 0.tmp

4 directories, 3 files
root@ubuntu:~/etcd-v3.5.0-linux-arm64#  ETCDCTL_API=3 ./etcdctl   --endpoints=$ENDPOINTS   snapshot save mysnapshot.db
Error: snapshot must be requested to one selected node, not multiple [http://10.10.18.42:2379 http://10.10.18.43:2379 http://10.10.18.44:2379]
root@ubuntu:~/etcd-v3.5.0-linux-arm64#  ETCDCTL_API=3 ./etcdctl   --endpoints=$ENDPOINTS    snapshot status mysnapshot.db -w json
Deprecated: Use `etcdutl snapshot status` instead.

Error: stat mysnapshot.db: no such file or directory
root@ubuntu:~/etcd-v3.5.0-linux-arm64#  ETCDCTL_API=3 ./etcdctl   --endpoints=http://10.10.18.43:2379    snapshot status mysnapshot.db -w json
Deprecated: Use `etcdutl snapshot status` instead.

Error: stat mysnapshot.db: no such file or directory
root@ubuntu:~/etcd-v3.5.0-linux-arm64#  ETCDCTL_API=3 ./etcdctl   --endpoints=http://10.10.18.43:2379    snapshot save mysnapshot.db
{"level":"info","ts":1624938894.0369105,"caller":"snapshot/v3_snapshot.go:68","msg":"created temporary db file","path":"mysnapshot.db.part"}
{"level":"info","ts":1624938894.0386374,"logger":"client","caller":"v3/maintenance.go:211","msg":"opened snapshot stream; downloading"}
{"level":"info","ts":1624938894.0386932,"caller":"snapshot/v3_snapshot.go:76","msg":"fetching snapshot","endpoint":"http://10.10.18.43:2379"}
{"level":"info","ts":1624938894.0599878,"logger":"client","caller":"v3/maintenance.go:219","msg":"completed snapshot read; closing"}
{"level":"info","ts":1624938894.0606616,"caller":"snapshot/v3_snapshot.go:91","msg":"fetched snapshot","endpoint":"http://10.10.18.43:2379","size":"328 kB","took":"now"}
{"level":"info","ts":1624938894.0607412,"caller":"snapshot/v3_snapshot.go:100","msg":"saved","path":"mysnapshot.db"}
Snapshot saved at mysnapshot.db
root@ubuntu:~/etcd-v3.5.0-linux-arm64#  ETCDCTL_API=3 ./etcdctl  snapshot status mysnapshot.db -w json
Deprecated: Use `etcdutl snapshot status` instead.

{"hash":3787458990,"revision":2,"totalKey":7,"totalSize":327680}
root@ubuntu:~/etcd-v3.5.0-linux-arm64# 

etcd 秘钥

ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 
  --cacert=<trusted-ca-file> --cert=<cert-file> --key=<key-file> 
  --cacert=""                verify certificates of TLS-enabled secure servers using this CA bundle
  --cert=""                    identify secure client using this TLS certificate file
  --key=""                    identify secure client using this TLS key file
  --endpoints=[127.0.0.1:2379]        gRPC endpoints
root@ubuntu:~/etcd-v3.5.0-linux-arm64# ls /etc/kubernetes/pki/etcd/
ca.crt  ca.key  healthcheck-client.crt  healthcheck-client.key  peer.crt  peer.key  server.crt  server.key
root@ubuntu:~/etcd-v3.5.0-linux-arm64#  ETCDCTL_API=3 ./etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt  --cert=/etc/kubernetes/pki/etcd/server.crt  --key=/etc/kubernetes/pki/etcd/server.key  --endpoints=$ENDPOINTS member list
1829ea2c82ecd13e, started, etcd1, http://10.10.18.42:2380, http://10.10.18.42:2379, false
19ddebfcb3e299fd, started, etcd2, http://10.10.18.43:2380, http://10.10.18.43:2379, false
fe3b541533812c5d, started, etcd3, http://10.10.18.44:2380, http://10.10.18.44:2379, false
root@ubuntu:~/etcd-v3.5.0-linux-arm64# 

k8s 和etcd

TLS 认证文件

需要为 etcd 集群创建加密通信的 TLS 证书,这里复用以前创建的 kubernetes 证书

root@ubuntu:/etc# ps -elf | grep etcd
4 S root      7969  7939  2  80   0 - 2672731 futex_ Jun18 ?      05:35:58 etcd --advertise-client-urls=https://10.10.16.82:2379 --cert-file=/etc/kubernetes/pki/etcd/server.crt --client-cert-auth=true --data-dir=/var/lib/etcd --initial-advertise-peer-urls=https://10.10.16.82:2380 --initial-cluster=ubuntu=https://10.10.16.82:2380 --key-file=/etc/kubernetes/pki/etcd/server.key --listen-client-urls=https://127.0.0.1:2379,https://10.10.16.82:2379 --listen-metrics-urls=http://127.0.0.1:2381 --listen-peer-urls=https://10.10.16.82:2380 --name=ubuntu --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt --peer-client-cert-auth=true --peer-key-file=/etc/kubernetes/pki/etcd/peer.key --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt --snapshot-count=10000 --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
[root@host-10-10-18-42 system]# curl --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt  --key /etc/kubernetes/pki/etcd/server.key  https://10.10.16.82:2379/version
{"etcdserver":"3.4.3","etcdcluster":"3.4.0"}
[root@host-10-10-18-42 system]# ls /etc/kubernetes/pki/etcd/
ca.crt  ca.key  healthcheck-client.crt  healthcheck-client.key  peer.crt  peer.key  server.crt  server.key
[root@host-10-10-18-42 system]# 
[root@host-10-10-18-42 etc]# systemctl status etcd.service -l
● etcd.service - Etcd Server
   Loaded: loaded (/usr/lib/systemd/system/etcd.service; disabled; vendor preset: disabled)
   Active: active (running) since Tue 2021-06-29 11:36:30 CST; 3h 11min ago
 Main PID: 4306 (etcd)
   CGroup: /system.slice/etcd.service
           └─4306 /usr/bin/etcd --name=etcd1 --data-dir=/data/k8s/etcd/data --listen-client-urls=http://10.10.18.42:2379

Jun 29 12:10:56 host-10-10-18-42 etcd[4306]: failed to send out heartbeat on time (exceeded the 100ms timeout for 31.49688ms)
Jun 29 12:10:56 host-10-10-18-42 etcd[4306]: server is likely overloaded
Jun 29 12:38:51 host-10-10-18-42 etcd[4306]: failed to send out heartbeat on time (exceeded the 100ms timeout for 36.45658ms)
Jun 29 12:38:51 host-10-10-18-42 etcd[4306]: server is likely overloaded
Jun 29 12:38:51 host-10-10-18-42 etcd[4306]: failed to send out heartbeat on time (exceeded the 100ms timeout for 217.69444ms)
Jun 29 12:38:51 host-10-10-18-42 etcd[4306]: server is likely overloaded
Jun 29 14:00:07 host-10-10-18-42 etcd[4306]: failed to send out heartbeat on time (exceeded the 100ms timeout for 5.25766ms)
Jun 29 14:00:07 host-10-10-18-42 etcd[4306]: server is likely overloaded
Jun 29 14:00:07 host-10-10-18-42 etcd[4306]: failed to send out heartbeat on time (exceeded the 100ms timeout for 33.283ms)
Jun 29 14:00:07 host-10-10-18-42 etcd[4306]: server is likely overloaded

the server is already initialized as member before, starting as etcd member

Jun 29 15:46:01 host-10-10-18-42 etcd[18666]: the server is already initialized as member before, starting as etcd member...
Jun 29 15:46:01 host-10-10-18-42 etcd[18666]: peerTLS: cert = /etc/kubernetes/pki/etcd/peer.crt, key = /etc/kubernetes/pki/etcd/peer.key, ca = , trusted-ca = /etc/kubernetes/pki/etcd/ca.crt, client-cert-auth = true, crl-file = 
Jun 29 15:46:01 host-10-10-18-42 etcd[18666]: The scheme of peer url http://10.10.18.42:2380 is HTTP while peer key/cert files are presented. Ignored peer key/cert files.
Jun 29 15:46:01 host-10-10-18-42 etcd[18666]: The scheme of peer url http://10.10.18.42:2380 is HTTP while client cert auth (--peer-client-cert-auth) is enabled. Ignored client cert auth for this url.
Jun 29 15:46:01 host-10-10-18-42 etcd[18666]: listening for peers on http://10.10.18.42:2380
Jun 29 15:46:01 host-10-10-18-42 etcd[18666]: The scheme of client url http://10.10.18.42:2379 is HTTP while peer key/cert files are presented. Ignored key/cert files.
Jun 29 15:46:01 host-10-10-18-42 etcd[18666]: The scheme of client url http://10.10.18.42:2379 is HTTP while client cert auth (--client-cert-auth) is enabled. Ignored client cert auth for this url.
Jun 29 15:46:01 host-10-10-18-42 etcd[18666]: listening for client requests on 10.10.18.42:2379
Jun 29 15:46:01 host-10-10-18-42 etcd[18666]: open /etc/kubernetes/pki/etcd/peer.key: permission denied
Jun 29 15:46:01 host-10-10-18-42 systemd[1]: etcd.service: main process exited, code=exited, status=1/FAILURE
Jun 29 15:46:01 host-10-10-18-42 systemd[1]: Failed to start Etcd Server.
[root@host-10-10-18-42 system]# chown -R etcd.etcd  /etc/kubernetes/pki/etcd

/usr/lib/systemd/system/etcd.service

添加秘钥

[root@host-10-10-18-42 system]# cat etcd.service
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
WorkingDirectory=/var/lib/etcd/
EnvironmentFile=-/etc/etcd/etcd.conf
User=etcd
# set GOMAXPROCS to number of processors
ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /usr/bin/etcd --name="${ETCD_NAME}" --data-dir="${ETCD_DATA_DIR}" --listen-client-urls="${ETCD_LISTEN_CLIENT_URLS}" --cert-file=/etc/kubernetes/pki/etcd/server.crt  --client-cert-auth=true  --key-file=/etc/kubernetes/pki/etcd/server.key --peer-key-file=/etc/kubernetes/pki/etcd/peer.key  --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt --peer-client-cert-auth=true"
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
[root@host-10-10-18-42 system]# systemctl daemon-reload
[root@host-10-10-18-42 system]# systemctl restart etcd
[root@host-10-10-18-42 system]# 
root@ubuntu:~/etcd-v3.5.0-linux-arm64#  ETCDCTL_API=3 ./etcdctl -w table  --endpoints=$ENDPOINTS endpoint  status
+-------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
|        ENDPOINT         |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+-------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| http://10.10.18.42:2379 | 1829ea2c82ecd13e |  3.3.11 |  262 kB |     false |      false |       270 |         13 |                  0 |        |
| http://10.10.18.43:2379 | 19ddebfcb3e299fd |  3.3.11 |  262 kB |     false |      false |       270 |         13 |                  0 |        |
| http://10.10.18.44:2379 | fe3b541533812c5d |  3.3.11 |  262 kB |      true |      false |       270 |         13 |                  0 |        |
+-------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
root@ubuntu:~/etcd-v3.5.0-linux-arm64# 
root@ubuntu:~/etcd-v3.5.0-linux-arm64#  ETCDCTL_API=3 ./etcdctl -w table  --endpoints=$ENDPOINTS endpoint health
+-------------------------+--------+-------------+-------+
|        ENDPOINT         | HEALTH |    TOOK     | ERROR |
+-------------------------+--------+-------------+-------+
| http://10.10.18.44:2379 |   true | 14.214315ms |       |
| http://10.10.18.43:2379 |   true | 17.301696ms |       |
| http://10.10.18.42:2379 |   true | 14.207596ms |       |
+-------------------------+--------+-------------+-------+
root@ubuntu:~/etcd-v3.5.0-linux-arm64#  ETCDCTL_API=3 ./etcdctl -w table  --endpoints=$ENDPOINTS member list
+------------------+---------+-------+-------------------------+-------------------------+------------+
|        ID        | STATUS  | NAME  |       PEER ADDRS        |      CLIENT ADDRS       | IS LEARNER |
+------------------+---------+-------+-------------------------+-------------------------+------------+
| 1829ea2c82ecd13e | started | etcd1 | http://10.10.18.42:2380 | http://10.10.18.42:2379 |      false |
| 19ddebfcb3e299fd | started | etcd2 | http://10.10.18.43:2380 | http://10.10.18.43:2379 |      false |
| fe3b541533812c5d | started | etcd3 | http://10.10.18.44:2380 | http://10.10.18.44:2379 |      false |
+------------------+---------+-------+-------------------------+-------------------------+------------+
root@ubuntu:~/etcd-v3.5.0-linux-arm64# 

k8s controller

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 10.10.18.46:6443 --token pbje64.ffl4ms0ymvjhwu52 
    --discovery-token-ca-cert-hash sha256:037f81a4c3dab193f50af44af460032172f7b8a700109c9ebebcc731728b165f 
[root@host-10-10-18-46 ~]# mkdir -p $HOME/.kube
[root@host-10-10-18-46 ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@host-10-10-18-46 ~]# chown $(id -u):$(id -g) $HOME/.kube/config
[root@host-10-10-18-46 ~]# kubeadm config print init-defaults > kubeadm-init.yaml.yaml
W0629 17:29:28.721072   20178 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
[root@host-10-10-18-46 ~]#
 
[root@host-10-10-18-46 ~]# ls
anaconda-ks.cfg  k8s.init  kubeadm-init.yaml.yaml
[root@host-10-10-18-46 ~]# kubeadm init --config=kubeadm-init.yaml.yaml
W0629 17:46:59.845088   14974 strict.go:54] error unmarshaling configuration schema.GroupVersionKind{Group:"kubeadm.k8s.io", Version:"v1beta2", Kind:"ClusterConfiguration"}: error converting YAML to JSON: yaml: unmarshal errors:
  line 15: key "imageRepository" already set in map
  line 18: key "apiServer" already set in map
  line 24: key "etcd" already set in map
W0629 17:46:59.847076   14974 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
[init] Using Kubernetes version: v1.18.0
[preflight] Running pre-flight checks
        [WARNING Service-Docker]: docker service is not enabled, please run 'systemctl enable docker.service'
        [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
        [WARNING SystemVerification]: this Docker version is not on the list of validated versions: 20.10.7. Latest validated version: 19.03
error execution phase preflight: [preflight] Some fatal errors occurred:
        [ERROR Port-6443]: Port 6443 is in use
        [ERROR Port-10259]: Port 10259 is in use
        [ERROR Port-10257]: Port 10257 is in use
        [ERROR FileAvailable--etc-kubernetes-manifests-kube-apiserver.yaml]: /etc/kubernetes/manifests/kube-apiserver.yaml already exists
        [ERROR FileAvailable--etc-kubernetes-manifests-kube-controller-manager.yaml]: /etc/kubernetes/manifests/kube-controller-manager.yaml already exists
        [ERROR FileAvailable--etc-kubernetes-manifests-kube-scheduler.yaml]: /etc/kubernetes/manifests/kube-scheduler.yaml already exists
        [ERROR FileAvailable--etc-kubernetes-manifests-etcd.yaml]: /etc/kubernetes/manifests/etcd.yaml already exists
        [ERROR Port-10250]: Port 10250 is in use
        [ERROR ExternalEtcdVersion]: Get https://10.10.18.42:2379/version: EOF
        [ERROR ExternalEtcdVersion]: Get https://10.10.18.43:2379/version: EOF
        [ERROR ExternalEtcdVersion]: Get https://10.10.18.44:2379/version: EOF
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher
[root@host-10-10-18-46 ~]# vi kubeadm-init.yaml.yaml 
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 1.2.3.4
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: host-10-10-18-46
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.18.0
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
controlPlaneEndpoint: 10.103.22.236:8443
apiServer:
  certSANs:
    - 10.10.18.45
    - 10.10.18.46
    - 10.10.16.249
    - 127.0.0.1
etcd:
    external:
        endpoints:
        - https://10.10.18.42:2379
        - https://10.10.18.43:2379
        - https://10.10.18.44:2379
        caFile: /etc/kubernetes/pki/etcd_bak/ca.crt
        certFile: /etc/kubernetes/pki/etcd_bak/server.crt
        keyFile: /etc/kubernetes/pki/etcd_bak/server.key
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
scheduler: {}
[root@host-10-10-18-46 ~]# curl --cacert /etc/kubernetes/pki/etcd_bak/ca.crt  --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key  -L https://10.10.18.44:2379/version
curl: (35) Encountered end of file
[root@host-10-10-18-46 ~]# curl --cacert /etc/kubernetes/pki/etcd_bak/ca.crt  --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key  -L https://10.10.18.44:2379/version -v
* About to connect() to 10.10.18.44 port 2379 (#0)
*   Trying 10.10.18.44...
* Connected to 10.10.18.44 (10.10.18.44) port 2379 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: /etc/kubernetes/pki/etcd_bak/ca.crt
  CApath: none
* NSS error -5961 (PR_CONNECT_RESET_ERROR)
* TCP connection reset by peer
* Closing connection 0
curl: (35) TCP connection reset by peer

 http没问题

[root@host-10-10-18-46 ~]# curl --cacert /etc/kubernetes/pki/etcd_bak/ca.crt  --cert /etc/kubernetes/pki/etcd/peer.crt --key /etc/kubernetes/pki/etcd/peer.key  -L http://10.10.18.44:2379/version 
{"etcdserver":"3.3.11","etcdcluster":"3.3.0"}
[root@host-10-10-18-46 ~]#
curl http://10.10.18.44:2379/version {"etcdserver":"3.3.11","etcdcluster":"3.3.0"}
[root@host-10-10-18-46 ~]#
root@ubuntu:~/etcd-v3.5.0-linux-arm64#  ETCDCTL_API=3 ./etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt  --cert=/etc/kubernetes/pki/etcd/server.crt  --key=/etc/kubernetes/pki/etcd/server.key  --endpoints=http://10.10.18.42:2379 member list
1829ea2c82ecd13e, started, etcd1, http://10.10.18.42:2380, http://10.10.18.42:2379, false
19ddebfcb3e299fd, started, etcd2, http://10.10.18.43:2380, http://10.10.18.43:2379, false
fe3b541533812c5d, started, etcd3, http://10.10.18.44:2380, http://10.10.18.44:2379, false
root@ubuntu:~/etcd-v3.5.0-linux-arm64#  ETCDCTL_API=3 ./etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt  --cert=/etc/kubernetes/pki/etcd/server.crt  --key=/etc/kubernetes/pki/etcd/server.key  --endpoints=http://10.10.18.43:2379 member list
1829ea2c82ecd13e, started, etcd1, http://10.10.18.42:2380, http://10.10.18.42:2379, false
19ddebfcb3e299fd, started, etcd2, http://10.10.18.43:2380, http://10.10.18.43:2379, false
fe3b541533812c5d, started, etcd3, http://10.10.18.44:2380, http://10.10.18.44:2379, false
root@ubuntu:~/etcd-v3.5.0-linux-arm64#  ETCDCTL_API=3 ./etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt  --cert=/etc/kubernetes/pki/etcd/server.crt  --key=/etc/kubernetes/pki/etcd/server.key  --endpoints=http://10.10.18.44:2379 member list
1829ea2c82ecd13e, started, etcd1, http://10.10.18.42:2380, http://10.10.18.42:2379, false
19ddebfcb3e299fd, started, etcd2, http://10.10.18.43:2380, http://10.10.18.43:2379, false
fe3b541533812c5d, started, etcd3, http://10.10.18.44:2380, http://10.10.18.44:2379, false
root@ubuntu:~/etcd-v3.5.0-linux-arm64# 

可以访问10.10.16.82:2379

[root@host-10-10-18-42 system]# curl --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt  --key /etc/kubernetes/pki/etcd/server.key  https://10.10.18.42:2379/version
curl: (35) Encountered end of file
[root@host-10-10-18-42 system]# curl --cacert /etc/kubernetes/pki/etcd/ca.crt --cert /etc/kubernetes/pki/etcd/server.crt  --key /etc/kubernetes/pki/etcd/server.key  https://10.10.16.82:2379/version
{"etcdserver":"3.4.3","etcdcluster":"3.4.0"}
[root@host-10-10-18-42 system]#
root@ubuntu:/etc# ps -elf | grep etcd | grep client-cert-auth
4 S root      7969  7939  2  80   0 - 2672731 futex_ Jun18 ?      05:44:28 etcd --advertise-client-urls=https://10.10.16.82:2379 --cert-file=/etc/kubernetes/pki/etcd/server.crt --client-cert-auth=true --data-dir=/var/lib/etcd --initial-advertise-peer-urls=https://10.10.16.82:2380 --initial-cluster=ubuntu=https://10.10.16.82:2380 --key-file=/etc/kubernetes/pki/etcd/server.key --listen-client-urls=https://127.0.0.1:2379,https://10.10.16.82:2379 --listen-metrics-urls=http://127.0.0.1:2381 --listen-peer-urls=https://10.10.16.82:2380 --name=ubuntu --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt --peer-client-cert-auth=true --peer-key-file=/etc/kubernetes/pki/etcd/peer.key --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt --snapshot-count=10000 --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt

 原来是没有开放https

重新生成etcd证书

创建基于根证书的config配置文件

#ca办法证书机构
cat > ca-config.json <<EOF
{
  "signing": { "default": { "expiry": "87600h"    }, "profiles": { "www": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } }
  }
}
EOF
#ca机构请求
cat > ca-csr.json <<EOF
{ "CN": "etcd CA", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Beijing", "ST": "Beijing" } ]
}
EOF
#生成证书:读取上边两个文件生成证书
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
root@ubuntu:~/cfssl/etcd# cat > ca-config.json <<EOF
> {
>   "signing": { "default": { "expiry": "87600h"  #证书过期时间h单位 }, "profiles": { "www": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } }
>   }
> }
> EOF
root@ubuntu:~/cfssl/etcd# cat > ca-csr.json <<EOF
> { "CN": "etcd CA", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Beijing", "ST": "Beijing" } ]
> }
> EOF
 

root@ubuntu:~/cfssl/etcd# ./cfssl gencert -initca ca-csr.json | ./cfssljson -bare ca -
2021/06/30 10:43:36 [INFO] generating a new CA key and certificate from CSR
2021/06/30 10:43:36 [INFO] generate received request
2021/06/30 10:43:36 [INFO] received CSR
2021/06/30 10:43:36 [INFO] generating key: rsa-2048
2021/06/30 10:43:37 [INFO] encoded CSR
2021/06/30 10:43:37 [INFO] signed certificate with serial number 53627328402430641884101375169327098053785759268
root@ubuntu:~/cfssl/etcd# 

创建生成etcd自签证书peer的csr的json配置文件

#etcd域名证书,需要把etcd节点ip都写进去,多写点备份用
cat > server-csr.json <<EOF
{ "CN": "etcd", "hosts": [ "10.10.18.42", "10.10.18.43", "10.10.18.44" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "BeiJing", "ST": "BeiJing" } ]
}
EOF
root@ubuntu:~/cfssl/etcd# ./cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | ./cfssljson -bare server
2021/06/30 10:46:48 [INFO] generate received request
2021/06/30 10:46:48 [INFO] received CSR
2021/06/30 10:46:48 [INFO] generating key: rsa-2048
2021/06/30 10:46:49 [INFO] encoded CSR
2021/06/30 10:46:49 [INFO] signed certificate with serial number 277831989248432604565440323258702823212559696597
cat <<EOF >/usr/lib/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
EnvironmentFile=/etc/etcd/etcd.conf
ExecStart=/usr/bin/etcd 
--name=etcd01 
--data-dir=${ETCD_DATA_DIR} 
--listen-peer-urls=${ETCD_LISTEN_PEER_URLS} 
--listen-client-urls=${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379 
--advertise-client-urls=${ETCD_ADVERTISE_CLIENT_URLS} 
--initial-advertise-peer-urls=${ETCD_INITIAL_ADVERTISE_PEER_URLS} 
--initial-cluster=${ETCD_INITIAL_CLUSTER} 
--initial-cluster-token=${ETCD_INITIAL_CLUSTER_TOKEN} 
--initial-cluster-state=new 
--cert-file=/opt/etcd/ssl/server.pem 
--key-file=/opt/etcd/ssl/server-key.pem 
--peer-cert-file=/opt/etcd/ssl/server.pem 
--peer-key-file=/opt/etcd/ssl/server-key.pem 
--trusted-ca-file=/opt/etcd/ssl/ca.pem 
--peer-trusted-ca-file=/opt/etcd/ssl/ca.pem
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF
[root@host-10-10-18-43 ~]# systemctl restart etcd
Job for etcd.service failed because a timeout was exceeded. See "systemctl status etcd.service" and "journalctl -xe" for details.
[root@host-10-10-18-43 ~]# journalctl -xe
Jun 30 11:05:58 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.42:57514" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:05:58 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.44:44110" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:05:58 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.44:44112" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:05:58 host-10-10-18-43 etcd[20044]: 19ddebfcb3e299fd is starting a new election at term 33312
Jun 30 11:05:58 host-10-10-18-43 etcd[20044]: 19ddebfcb3e299fd became candidate at term 33313
Jun 30 11:05:58 host-10-10-18-43 etcd[20044]: 19ddebfcb3e299fd received MsgVoteResp from 19ddebfcb3e299fd at term 33313
Jun 30 11:05:58 host-10-10-18-43 etcd[20044]: 19ddebfcb3e299fd [logterm: 275, index: 25] sent MsgVote request to 1829ea2c82ecd13e at term 33313
Jun 30 11:05:58 host-10-10-18-43 etcd[20044]: 19ddebfcb3e299fd [logterm: 275, index: 25] sent MsgVote request to fe3b541533812c5d at term 33313
Jun 30 11:05:58 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.42:57526" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:05:58 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.44:44120" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:05:58 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.44:44122" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:05:58 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.42:57524" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:05:58 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.42:57536" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:05:58 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.42:57538" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:05:58 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.44:44130" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:05:58 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.44:44128" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:05:59 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.44:44140" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:05:59 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.42:57548" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:05:59 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.44:44138" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:05:59 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.42:57546" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:05:59 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.42:57558" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:05:59 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.44:44148" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:05:59 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.44:44150" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:05:59 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.42:57556" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:05:59 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.44:44158" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:05:59 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.44:44156" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:05:59 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.42:57566" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:05:59 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.42:57568" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:05:59 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.44:44166" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:05:59 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.44:44164" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:05:59 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.42:57580" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:05:59 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.42:57578" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:06:00 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.42:57620" (error "tls: oversized record received with length 21536", ServerName "")
Jun 30 11:06:00 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.44:44172" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:06:00 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.44:44174" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:06:00 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.42:57590" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:06:00 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.42:57592" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:06:00 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.42:57646" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:06:00 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.44:44208" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:06:00 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.44:44210" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:06:00 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.42:57644" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:06:00 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.42:57658" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:06:00 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.44:44218" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:06:00 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.44:44220" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:06:00 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.42:57656" (error "tls: first record does not look like a TLS handshake", ServerName "")
Jun 30 11:06:00 host-10-10-18-43 etcd[20044]: rejected connection from "10.10.18.42:57666" (error "tls: first record does not look like a TLS handshake", ServerName "")

删除旧的

[root@host-10-10-18-43 ~]# rm  /data/k8s/etcd/wal/* -rf
[root@host-10-10-18-43 ~]# rm  /data/k8s/etcd/data/* -rf
[root@host-10-10-18-43 ~]#  systemctl status  etcd
● etcd.service - Etcd Server
   Loaded: loaded (/usr/lib/systemd/system/etcd.service; disabled; vendor preset: disabled)
   Active: active (running) since Wed 2021-06-30 11:14:58 CST; 1min 13s ago
 Main PID: 20226 (etcd)
   CGroup: /system.slice/etcd.service
           └─20226 /usr/bin/etcd --name=etcd2 --data-dir=/data/k8s/etcd/data

访问成功

[root@host-10-10-18-46 ~]# curl --cacert /opt/etcd/ssl/ca.pem  --cert /opt/etcd/ssl/server.pem --key /opt/etcd/ssl/server-key.pem  https://10.10.18.42:2379/version
{"etcdserver":"3.3.11","etcdcluster":"3.3.0"}[root@host-10-10-18-46 ~]# 

 kubeadm init --config

init失败查看kubelet

Jun 30 11:32:14 host-10-10-18-46 kubelet[25210]: E0630 11:32:14.112133   25210 kubelet.go:2267] node "host-10-10-18-46" not found
Jun 30 11:32:14 host-10-10-18-46 kubelet[25210]: E0630 11:32:14.212346   25210 kubelet.go:2267] node "host-10-10-18-46" not found
Jun 30 11:32:14 host-10-10-18-46 kubelet[25210]: E0630 11:32:14.312579   25210 kubelet.go:2267] node "host-10-10-18-46" not found
Jun 30 11:32:14 host-10-10-18-46 kubelet[25210]: E0630 11:32:14.412767   25210 kubelet.go:2267] node "host-10-10-18-46" not found
Jun 30 11:32:14 host-10-10-18-46 kubelet[25210]: E0630 11:32:14.512983   25210 kubelet.go:2267] node "host-10-10-18-46" not found
Jun 30 11:32:14 host-10-10-18-46 kubelet[25210]: E0630 11:32:14.613160   25210 kubelet.go:2267] node "host-10-10-18-46" not found
Jun 30 11:32:14 host-10-10-18-46 kubelet[25210]: E0630 11:32:14.713375   25210 kubelet.go:2267] node "host-10-10-18-46" not found
Jun 30 11:32:14 host-10-10-18-46 kubelet[25210]: E0630 11:32:14.813574   25210 kubelet.go:2267] node "host-10-10-18-46" not found
Jun 30 11:32:14 host-10-10-18-46 kubelet[25210]: E0630 11:32:14.913774   25210 kubelet.go:2267] node "host-10-10-18-46" not found
Jun 30 11:32:15 host-10-10-18-46 kubelet[25210]: E0630 11:32:15.013968   25210 kubelet.go:2267] node "host-10-10-18-46" not found
Jun 30 11:32:15 host-10-10-18-46 kubelet[25210]: E0630 11:32:15.114144   25210 kubelet.go:2267] node "host-10-10-18-46" not found
Jun 30 11:32:15 host-10-10-18-46 kubelet[25210]: E0630 11:32:15.214331   25210 kubelet.go:2267] node "host-10-10-18-46" not found
Jun 30 11:32:15 host-10-10-18-46 kubelet[25210]: E0630 11:32:15.314539   25210 kubelet.go:2267] node "host-10-10-18-46" not found
Jun 30 11:32:15 host-10-10-18-46 kubelet[25210]: E0630 11:32:15.414737   25210 kubelet.go:2267] node "host-10-10-18-46" not found
Jun 30 11:32:15 host-10-10-18-46 kubelet[25210]: E0630 11:32:15.514889   25210 kubelet.go:2267] node "host-10-10-18-46" not found
Jun 30 11:32:15 host-10-10-18-46 kubelet[25210]: E0630 11:32:15.615078   25210 kubelet.go:2267] node "host-10-10-18-46" not found
Jun 30 11:32:15 host-10-10-18-46 kubelet[25210]: E0630 11:32:15.715240   25210 kubelet.go:2267] node "host-10-10-18-46" not found
[root@host-10-10-18-46 ~]# cat /etc/kubernetes/kubelet.conf
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeE1EWXpNREF6TWpNek5Gb1hEVE14TURZeU9EQXpNak16TkZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTUt0CndHbXB2bTBPaFFPMjVBeFpJM295Z2FRS0VGSk81c0JSMmVoem1yN2ZVNlBaWWhrb1BoTXZEZ3RCNmdnNlBjQkcKNFB3M2JlQnNBZXZGaThkNEJ0bFVLeTdJVTFrZHdtcldMTHZBT3lRVnJveExSQ0V0QUVMNWlyUENYQmFjZVBTbwpRV3lnRUFYTEQvTkNOb0NndDF1a3RYSEVHNTlWdG1RbmtiSitnVGNpK1FrWnl5MGRQOWUyOE83SjRIcUhUNHo5CkVRNTlUamprdWVid2VaUmF6WVFYQTV1TWZHY2tJK05VQytCank0NHhQYnNTL2FRSnJPM1c2NzQydTJtdXFXblEKUmZBRHJLOGhMODRVWW4vL1ZReWM4cjFNWENEVXRBd0gyU3dROE1EZTJFM3VURGNyU29HSWx4RXJvelR3Y3ZCNgoweDQwVXAwSEhXZ0NQOVF4Ulk4Q0F3RUFBYU1qTUNFd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFKQS9NVVhVVVU0K0ZmVFExaHROQ2JHeUF2SjMKZjZLOHAzUHZEdnQvR2xwWXFMZkRhaFltWHh3ZEsyaFNVMGliRFZkMW1vem0xL3dmenYzbTl2Z1dKR09rTFhVOQpoSlZkNWVGM0IyNWRkWGdhOGVvVVFJdWNMV2t3QklrSmtITnpiRUJ5UmVlTEV4WUZKN205bXFKa1Z4SVN6Rm1FClN6MG96cXRMQUtHaWZSTnhUbXQvbjQ3RjJma2psNmlYRDlpOGx5WmNyOUxVZklIcTVldFYvYmNRbWdOQ01yZXcKeGZ5R3h1YVgxZ2NQT2JITmVQMUUxcXljOHI5dWU3RWFzSFlhaTY4REFTVWxFalJJMXRxUDgwYkZRSHQzRU5xaAp0ckFKdzIzVzhEcTRibHlDdld1YTBCanB0SG1pWFY0UENVZ1dvK3VsUEVWWXVibzlXbC9jUnZxOENMWT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
    server: https://10.103.22.236:8443
  name: kubernetes
[root@host-10-10-18-46 ~]# cat kubeadm-init.yaml.yaml
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 1.2.3.4
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: host-10-10-18-46
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.18.0
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
controlPlaneEndpoint: 10.103.22.236:8443
[root@host-10-10-18-46 ~]# netstat -pan | grep 6443
tcp        0      1 10.10.18.46:45042       1.2.3.4:6443            SYN_SENT    25210/kubelet       
tcp        0      1 10.10.18.46:45024       1.2.3.4:6443            SYN_SENT    25210/kubelet       
tcp6       0      0 :::6443                 :::*                    LISTEN      27229/kube-apiserve 
tcp6       0      0 ::1:6443                ::1:55698               ESTABLISHED 27229/kube-apiserve 
tcp6       0      0 ::1:55698               ::1:6443                ESTABLISHED 27229/kube-apiserve 
unix  3      [ ]         STREAM     CONNECTED     36443    1/systemd            /run/systemd/journal/stdout
[root@host-10-10-18-46 ~]# 

另外一个节点

[root@host-10-10-18-45 ~]#  kubeadm  version
kubeadm version: &version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.1", GitCommit:"7879fc12a63337efff607952a323df90cdc7a335", GitTreeState:"clean", BuildDate:"2020-04-08T17:36:32Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/arm64"}
[root@host-10-10-18-45 ~]# netstat -pan | grep 6443
[root@host-10-10-18-45 ~]# 

配置keepalived + haproxy

#---------------------------------------------------------------------
# Example configuration for a possible web application.  See the
# full configuration options online.
#
#   https://www.haproxy.org/download/2.1/doc/configuration.txt
#   https://cbonte.github.io/haproxy-dconv/2.1/configuration.html#
#---------------------------------------------------------------------
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    # to have these messages end up in /var/log/haproxy.log you will
    # need to:
    #
    # 1) configure syslog to accept network log events.  This is done
    #    by adding the '-r' option to the SYSLOGD_OPTIONS in
    #    /etc/sysconfig/syslog
    #
    # 2) configure local2 events to go to the /var/log/haproxy.log
    #   file. A line like the following can be added to
    #   /etc/sysconfig/syslog
    #
    #    local2.*                       /var/log/haproxy.log
    #
    log         127.0.0.1 local2
#    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
#    user        haproxy
#    group       haproxy
    # daemon
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend frr 
    mode tcp
    bind *:9443  ## 监听9443端口
    # bind *:443 ssl # To be completed ....
 
    acl url_static   path_beg   -i /static /images /javascript /stylesheets
    acl url_static   path_end   -i .jpg .gif .png .css .js
 
    default_backend  kube-apiserver 
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend kube-apiserver
    mode tcp
    option tcplog
    option tcp-check
    balance roundrobin
    default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
    server host-10-10-18-46 10.10.18.46:6443 check

暂时只配置一个server

keepavlivede vip

root@ubuntu:/etc/haproxy# cat ../keepalived/keepalived.conf
global_defs {
   script_user root 
   enable_script_security
 
}
 
vrrp_script chk_haproxy {
    script "/bin/bash -c 'if [[ $(netstat -nlp | grep 9443 | wc -l) ]]; then exit 0; else exit 1; fi'"  # haproxy 检测
    interval 2  # 每2秒执行一次检测
    #weight -10 # 权重变化
}
 
vrrp_instance VI_1 {
  interface enahisic2i0   ###宿主机网卡名
 
  state BACKUP
  virtual_router_id 61 # id设为相同,表示是同一个虚拟路由组
  priority 80 #初始权重
  nopreempt #不抢占
 
  unicast_peer {
  10.10.16.47
  10.10.16.251 
  }
 
  virtual_ipaddress {
    10.10.16.249  # vip
  }
 
  authentication {
    auth_type PASS
    auth_pass password
  }
 
  track_script {
      chk_haproxy
  }
 
  #notify "/container/service/keepalived/assets/"
}

访问keepalived vip 

root@ubuntu:/etc/haproxy# telnet 10.10.16.249 9443
Trying 10.10.16.249...
Connected to 10.10.16.249.
Escape character is '^]'.
^C^CConnection closed by foreign host.
[root@host-10-10-18-46 ~]# kubeadm init --config kubeadm-init.yaml.yaml 
W0630 12:02:37.304175    1295 strict.go:54] error unmarshaling configuration schema.GroupVersionKind{Group:"kubeadm.k8s.io", Version:"v1beta2", Kind:"ClusterConfiguration"}: error converting YAML to JSON: yaml: unmarshal errors:
  line 15: key "imageRepository" already set in map
  line 18: key "apiServer" already set in map
  line 24: key "etcd" already set in map
Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:

  kubeadm join 10.10.16.249:9443 --token abcdef.0123456789abcdef 
    --discovery-token-ca-cert-hash sha256:9bc0bcddb2b97791717943b714ffa410cb5963061889086f04  
    --control-plane 

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 10.10.16.249:9443 --token abcdef.0123456789abcdef 
    --discovery-token-ca-cert-hash sha256:9bc0bcddb2b97791717943b714ffa410cb5963061889 

kubeadm-init.yaml

[root@host-10-10-18-46 ~]# cat kubeadm-init.yaml.yaml
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 1.2.3.4  --默认
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: host-10-10-18-46
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.18.0
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
controlPlaneEndpoint: 10.10.16.249:9443  
apiServer:
  certSANs:
    - 10.10.18.45
    - 10.10.18.46
    - 10.10.16.249
    - 127.0.0.1
etcd:
    external:
        endpoints:
        - https://10.10.18.42:2379
        - https://10.10.18.43:2379
        - https://10.10.18.44:2379
        caFile:  /opt/etcd/ssl/ca.pem
        certFile: /opt/etcd/ssl/server.pem 
        keyFile: /opt/etcd/ssl/server-key.pem 
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
scheduler: {}
[root@host-10-10-18-46 ~]# ps -elf | grep apiserver
0 S root     31133 21547  0  80   0 -  1724 pipe_w 14:18 pts/0    00:00:00 grep --color=auto apiserver
[root@host-10-10-18-46 ~]# kubectl -n kube-system get pods -o wide
The connection to the server 10.10.18.46:6443 was refused - did you specify the right host or port?
[root@host-10-10-18-46 ~]# netstat -pan | grep 6443
unix  3      [ ]         STREAM     CONNECTED     36443    1/systemd            /run/systemd/journal/stdout
[root@host-10-10-18-46 ~]# ps -elf | grep apiserver
0 S root     31196 21547  0  80   0 -  1724 pipe_w 14:18 pts/0    00:00:00 grep --color=auto apiserver
[root@host-10-10-18-46 ~]# 

重启kubelet

 systemctl restart  kubelet
[root@host-10-10-18-46 ~]# ps -elf | grep apiserver
4 S root     31884 31863 29  80   0 -  7681 futex_ 14:19 ?        00:00:13 kube-apiserver --advertise-address=1.2.3.4 --allow-privileged=true --authorization-mode=Node,RBAC --client-ca-file=/etc/kubernetes/pki/ca.crt --enable-admission-plugins=NodeRestriction --enable-bootstrap-token-auth=true --etcd-cafile=/opt/etcd/ssl/ca.pem --etcd-certfile=/opt/etcd/ssl/server.pem --etcd-keyfile=/opt/etcd/ssl/server-key.pem --etcd-servers=https://10.10.18.42:2379,https://10.10.18.43:2379,https://10.10.18.44:2379 --insecure-port=0 --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key --requestheader-allowed-names=front-proxy-client --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-key-file=/etc/kubernetes/pki/sa.pub --service-cluster-ip-range=10.96.0.0/12 --tls-cert-file=/etc/kubernetes/pki/apiserver.crt --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
0 S root     32191 21547  0  80   0 -  1724 pipe_w 14:20 pts/0    00:00:00 grep --color=auto apiserver
[root@host-10-10-18-46 ~]# netstat -pan | grep 6443
tcp        0      1 10.10.18.46:48926       1.2.3.4:6443            SYN_SENT    31315/kubelet       
tcp        0      1 10.10.18.46:48936       1.2.3.4:6443            SYN_SENT    31315/kubelet       
tcp6       0      0 :::6443                 :::*                    LISTEN      31884/kube-apiserve 
tcp6       0      0 10.10.18.46:6443        10.10.16.82:42914       ESTABLISHED 31884/kube-apiserve 
tcp6       0      0 ::1:6443                ::1:59596               ESTABLISHED 31884/kube-apiserve 
tcp6       0      0 ::1:59596               ::1:6443                ESTABLISHED 31884/kube-apiserve 
tcp6       0      0 10.10.18.46:6443        10.10.16.82:42906       ESTABLISHED 31884/kube-apiserve 
tcp6       0      0 10.10.18.46:6443        10.10.16.82:42930       ESTABLISHED 31884/kube-apiserve 
tcp6       0      0 10.10.18.46:6443        10.10.16.82:42966       ESTABLISHED 31884/kube-apiserve 
tcp6       0      0 10.10.18.46:6443        10.10.16.82:42900       ESTABLISHED 31884/kube-apiserve 

配置执行 kubectl 命令用户

[root@host-10-10-18-46 ~]# kubectl -n kube-system get pods -o wide
Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")
[root@host-10-10-18-46 ~]# mkdir -p $HOME/.kube
[root@host-10-10-18-46 ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
cp: overwrite ‘/root/.kube/config’? y                                         
[root@host-10-10-18-46 ~]# chown $(id -u):$(id -g) $HOME/.kube/config
[root@host-10-10-18-46 ~]# kubectl -n kube-system get pods -o wide
NAME                                       READY   STATUS    RESTARTS   AGE    IP            NODE               NOMINATED NODE   READINESS GATES
coredns-546565776c-ch9n7                   0/1     Pending   0          135m   <none>        <none>             <none>           <none>
coredns-546565776c-dddl9                   0/1     Pending   0          135m   <none>        <none>             <none>           <none>
kube-apiserver-host-10-10-18-46            1/1     Running   34         139m   10.10.18.46   host-10-10-18-46   <none>           <none>
kube-controller-manager-host-10-10-18-46   1/1     Running   25         139m   10.10.18.46   host-10-10-18-46   <none>           <none>
kube-proxy-zl8fw                           1/1     Running   0          135m   10.10.18.46   host-10-10-18-46   <none>           <none>
kube-scheduler-host-10-10-18-46            1/1     Running   25         139m   10.10.18.46   host-10-10-18-46   <none>           <none>
[root@host-10-10-18-46 ~]# 

查看集群状态

[root@host-10-10-18-46 ~]# kubectl get cs
NAME                 STATUS      MESSAGE                                                                                     ERROR
scheduler            Unhealthy   Get http://127.0.0.1:10251/healthz: dial tcp 127.0.0.1:10251: connect: connection refused   
controller-manager   Healthy     ok                                                                                          
etcd-1               Healthy     {"health":"true"}                                                                           
etcd-2               Healthy     {"health":"true"}                                                                           
etcd-0               Healthy     {"health":"true"}                                                                           
[root@host-10-10-18-46 ~]# 
root@ubuntu:~/cfssl/etcd# ETCDCTL_API=3 ./etcdctl --cacert  ./etcd/ca.pem  --cert   ./etcd/server.pem --key   ./etcd/server-key.pem  --endpoints=https://10.10.18.42:2379  get / --prefix --keys-only | more
/registry/apiregistration.k8s.io/apiservices/v1.

/registry/apiregistration.k8s.io/apiservices/v1.admissionregistration.k8s.io

/registry/apiregistration.k8s.io/apiservices/v1.apiextensions.k8s.io

/registry/apiregistration.k8s.io/apiservices/v1.apps

/registry/apiregistration.k8s.io/apiservices/v1.authentication.k8s.io

/registry/apiregistration.k8s.io/apiservices/v1.authorization.k8s.io

/registry/apiregistration.k8s.io/apiservices/v1.autoscaling

/registry/apiregistration.k8s.io/apiservices/v1.batch
root@ubuntu:~/cfssl/etcd# ETCDCTL_API=3 ./etcdctl --cacert  ./etcd/ca.pem  --cert   ./etcd/server.pem --key   ./etcd/server-key.pem  --endpoints=https://10.10.18.42:2379  get /registry/clusterrolebindings/kubeadm:get-nodes
/registry/clusterrolebindings/kubeadm:get-nodes
k8s
2
rbac.authorization.k8s.io/v1ClusterRoleBindingkubeadm:get-nodes"*$a0766228-3694-4906-9787-b2ca2b181b7b2z

                                                                                                           kubeadmUpdaterbac.authorization.k8s.io/vFieldsV1:I
G{"f:roleRef":{"f:apiGroup":{},"f:kind":{},"f:name":{}},"f:subjects":{}}U
Grouprbac.authorization.k8s.io/system:bootstrappers:kubeadm:default-node-token";
rbac.authorization.k8s.io
                         ClusterRolekubeadm:get-nodes"

 

[root@host-10-10-18-46 ~]# kubectl -n kube-system get nodes
NAME               STATUS     ROLES    AGE    VERSION
host-10-10-18-46   NotReady   master   157m   v1.18.1
[root@host-10-10-18-46 ~]# 
[root@host-10-10-18-46 ~]# kubectl -n kube-system get pods -o wide
NAME                                       READY   STATUS    RESTARTS   AGE    IP            NODE               NOMINATED NODE   READINESS GATES
coredns-546565776c-ch9n7                   0/1     Pending   0          157m   <none>        <none>             <none>           <none>
coredns-546565776c-dddl9                   0/1     Pending   0          157m   <none>        <none>             <none>           <none>
kube-apiserver-host-10-10-18-46            1/1     Running   41         160m   10.10.18.46   host-10-10-18-46   <none>           <none>
kube-controller-manager-host-10-10-18-46   1/1     Running   31         160m   10.10.18.46   host-10-10-18-46   <none>           <none>
kube-proxy-zl8fw                           1/1     Running   0          157m   10.10.18.46   host-10-10-18-46   <none>           <none>
kube-scheduler-host-10-10-18-46            1/1     Running   31         160m   10.10.18.46   host-10-10-18-46   <none>           <none>
[root@host-10-10-18-46 ~]# kubectl -n kube-system describe  coredns-546565776c-ch9n7
error: the server doesn't have a resource type "coredns-546565776c-ch9n7"
[root@host-10-10-18-46 ~]# kubectl -n kube-system describe  pods coredns-546565776c-ch9n7
Name:                 coredns-546565776c-ch9n7
Namespace:            kube-system
Priority:             2000000000
Priority Class Name:  system-cluster-critical
Node:                 <none>
Labels:               k8s-app=kube-dns
                      pod-template-hash=546565776c
Annotations:          <none>
Status:               Pending
IP:                   
IPs:                  <none>
Controlled By:        ReplicaSet/coredns-546565776c
Containers:
  coredns:
    Image:       registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.7
    Ports:       53/UDP, 53/TCP, 9153/TCP
    Host Ports:  0/UDP, 0/TCP, 0/TCP
    Args:
      -conf
      /etc/coredns/Corefile
    Limits:
      memory:  170Mi
    Requests:
      cpu:        100m
      memory:     70Mi
    Liveness:     http-get http://:8080/health delay=60s timeout=5s period=10s #success=1 #failure=5
    Readiness:    http-get http://:8181/ready delay=0s timeout=1s period=10s #success=1 #failure=3
    Environment:  <none>
    Mounts:
      /etc/coredns from config-volume (ro)
      /var/run/secrets/kubernetes.io/serviceaccount from coredns-token-gl9fl (ro)
Conditions:
  Type           Status
  PodScheduled   False 
Volumes:
  config-volume:
    Type:      ConfigMap (a volume populated by a ConfigMap)
    Name:      coredns
    Optional:  false
  coredns-token-gl9fl:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  coredns-token-gl9fl
    Optional:    false
QoS Class:       Burstable
Node-Selectors:  kubernetes.io/os=linux
Tolerations:     CriticalAddonsOnly
                 node-role.kubernetes.io/master:NoSchedule
                 node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason            Age        From               Message
  ----     ------            ----       ----               -------
  Warning  FailedScheduling  <unknown>  default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  <unknown>  default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  <unknown>  default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  <unknown>  default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  <unknown>  default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  <unknown>  default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  <unknown>  default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  <unknown>  default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  <unknown>  default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  <unknown>  default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  <unknown>  default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  <unknown>  default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  <unknown>  default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  <unknown>  default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  <unknown>  default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  <unknown>  default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  <unknown>  default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  <unknown>  default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  <unknown>  default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  <unknown>  default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  120m       default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  110m       default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  99m        default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  89m        default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  80m        default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  70m        default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  57m        default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  43m        default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  33m        default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  23m        default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  6m19s      default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
[root@host-10-10-18-46 ~]# 

允许master节点部署pod,使用命令如下:

[root@host-10-10-18-46 ~]# kubectl taint nodes --all node-role.kubernetes.io/master-
node/host-10-10-18-46 untainted
[root@host-10-10-18-46 ~]# kubectl -n kube-system get pods -o wide
NAME                                       READY   STATUS    RESTARTS   AGE    IP            NODE               NOMINATED NODE   READINESS GATES
coredns-546565776c-ch9n7                   0/1     Pending   0          159m   <none>        <none>             <none>           <none>
coredns-546565776c-dddl9                   0/1     Pending   0          159m   <none>        <none>             <none>           <none>
kube-apiserver-host-10-10-18-46            1/1     Running   42         162m   10.10.18.46   host-10-10-18-46   <none>           <none>
kube-controller-manager-host-10-10-18-46   1/1     Running   32         162m   10.10.18.46   host-10-10-18-46   <none>           <none>
kube-proxy-zl8fw                           1/1     Running   0          159m   10.10.18.46   host-10-10-18-46   <none>           <none>
kube-scheduler-host-10-10-18-46            1/1     Running   32         162m   10.10.18.46   host-10-10-18-46   <none>           <none>
[root@host-10-10-18-46 ~]# kubectl -n kube-system delete pods coredns-546565776c-ch9n7  coredns-546565776c-dddl9 
pod "coredns-546565776c-ch9n7" deleted
pod "coredns-546565776c-dddl9" deleted
[root@host-10-10-18-46 ~]# kubectl -n kube-system get pods -o wide
NAME                                       READY   STATUS    RESTARTS   AGE    IP            NODE               NOMINATED NODE   READINESS GATES
coredns-546565776c-v49kt                   0/1     Pending   0          3s     <none>        <none>             <none>           <none>
coredns-546565776c-z5pq6                   0/1     Pending   0          4s     <none>        <none>             <none>           <none>
kube-apiserver-host-10-10-18-46            1/1     Running   42         163m   10.10.18.46   host-10-10-18-46   <none>           <none>
kube-controller-manager-host-10-10-18-46   1/1     Running   32         163m   10.10.18.46   host-10-10-18-46   <none>           <none>
kube-proxy-zl8fw                           1/1     Running   0          160m   10.10.18.46   host-10-10-18-46   <none>           <none>
kube-scheduler-host-10-10-18-46            1/1     Running   32         163m   10.10.18.46   host-10-10-18-46   <none>           <none>

没有paused 

首先,我们看看需要安装哪些镜像,使用如下命令:

[root@host-10-10-18-46 ~]# kubeadm config images list
I0630 15:03:59.166843   13472 version.go:252] remote version is much newer: v1.21.2; falling back to: stable-1.18
W0630 15:03:59.835027   13472 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
k8s.gcr.io/kube-apiserver:v1.18.20
k8s.gcr.io/kube-controller-manager:v1.18.20
k8s.gcr.io/kube-scheduler:v1.18.20
k8s.gcr.io/kube-proxy:v1.18.20
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.7
[root@host-10-10-18-46 ~]# kubectl -n kube-system get nodes
NAME               STATUS     ROLES    AGE    VERSION
host-10-10-18-46   NotReady   master   166m   v1.18.1
[root@host-10-10-18-46 ~]# 
QoS Class:       Burstable
Node-Selectors:  kubernetes.io/os=linux
Tolerations:     CriticalAddonsOnly
                 node-role.kubernetes.io/master:NoSchedule
                 node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason            Age        From               Message
  ----     ------            ----       ----               -------
  Warning  FailedScheduling  <unknown>  default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  <unknown>  default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
[root@host-10-10-18-46 ~]# 
[root@host-10-10-18-46 ~]# kubectl describe node  host-10-10-18-46
Name:               host-10-10-18-46
Roles:              master
Labels:             beta.kubernetes.io/arch=arm64
                    beta.kubernetes.io/os=linux
                    kubernetes.io/arch=arm64
                    kubernetes.io/hostname=host-10-10-18-46
                    kubernetes.io/os=linux
                    node-role.kubernetes.io/master=
Annotations:        kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
                    node.alpha.kubernetes.io/ttl: 0
                    volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp:  Wed, 30 Jun 2021 12:03:35 +0800
Taints:             node.kubernetes.io/not-ready:NoSchedule
Unschedulable:      false
Lease:
  HolderIdentity:  host-10-10-18-46
  AcquireTime:     <unset>
  RenewTime:       Wed, 30 Jun 2021 14:54:05 +0800
Conditions:
  Type             Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message
  ----             ------  -----------------                 ------------------                ------                       -------
  MemoryPressure   False   Wed, 30 Jun 2021 14:49:22 +0800   Wed, 30 Jun 2021 12:03:35 +0800   KubeletHasSufficientMemory   kubelet has sufficient memory available
  DiskPressure     False   Wed, 30 Jun 2021 14:49:22 +0800   Wed, 30 Jun 2021 12:03:35 +0800   KubeletHasNoDiskPressure     kubelet has no disk pressure
  PIDPressure      False   Wed, 30 Jun 2021 14:49:22 +0800   Wed, 30 Jun 2021 12:03:35 +0800   KubeletHasSufficientPID      kubelet has sufficient PID available
  Ready            False   Wed, 30 Jun 2021 14:49:22 +0800   Wed, 30 Jun 2021 12:03:35 +0800   KubeletNotReady              runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
Addresses:
  InternalIP:  10.10.18.46
  Hostname:    host-10-10-18-46
Capacity:
  cpu:                4
  ephemeral-storage:  7978Mi
  hugepages-2Mi:      0
  hugepages-512Mi:    0
  memory:             7756672Ki
  pods:               110
Allocatable:
  cpu:                4
  ephemeral-storage:  7528985383
  hugepages-2Mi:      0
  hugepages-512Mi:    0
  memory:             7654272Ki
  pods:               110
System Info:
  Machine ID:                 30689d599b59462f9fee88051771bea5
  System UUID:                B80706BA-B199-4ED2-927B-66A6EC045417
  Boot ID:                    3205f1fc-6015-4fcd-a9c1-c9c24e2d8d80
  Kernel Version:             4.14.0-115.el7a.0.1.aarch64
  OS Image:                   CentOS Linux 7 (AltArch)
  Operating System:           linux
  Architecture:               arm64
  Container Runtime Version:  docker://20.10.7
  Kubelet Version:            v1.18.1
  Kube-Proxy Version:         v1.18.1
Non-terminated Pods:          (4 in total)
  Namespace                   Name                                        CPU Requests  CPU Limits  Memory Requests  Memory Limits  AGE
  ---------                   ----                                        ------------  ----------  ---------------  -------------  ---
  kube-system                 kube-apiserver-host-10-10-18-46             250m (6%)     0 (0%)      0 (0%)           0 (0%)         169m
  kube-system                 kube-controller-manager-host-10-10-18-46    200m (5%)     0 (0%)      0 (0%)           0 (0%)         170m
  kube-system                 kube-proxy-zl8fw                            0 (0%)        0 (0%)      0 (0%)           0 (0%)         166m
  kube-system                 kube-scheduler-host-10-10-18-46             100m (2%)     0 (0%)      0 (0%)           0 (0%)         170m
Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource           Requests    Limits
  --------           --------    ------
  cpu                550m (13%)  0 (0%)
  memory             0 (0%)      0 (0%)
  ephemeral-storage  0 (0%)      0 (0%)
  hugepages-2Mi      0 (0%)      0 (0%)
  hugepages-512Mi    0 (0%)      0 (0%)
Events:
  Type    Reason                   Age                  From                          Message
  ----    ------                   ----                 ----                          -------
  Normal  Starting                 171m                 kubelet, host-10-10-18-46     Starting kubelet.
  Normal  NodeAllocatableEnforced  171m                 kubelet, host-10-10-18-46     Updated Node Allocatable limit across pods
  Normal  NodeHasSufficientMemory  171m (x5 over 171m)  kubelet, host-10-10-18-46     Node host-10-10-18-46 status is now: NodeHasSufficientMemory
  Normal  NodeHasNoDiskPressure    171m (x4 over 171m)  kubelet, host-10-10-18-46     Node host-10-10-18-46 status is now: NodeHasNoDiskPressure
  Normal  NodeHasSufficientPID     171m (x4 over 171m)  kubelet, host-10-10-18-46     Node host-10-10-18-46 status is now: NodeHasSufficientPID
  Normal  Starting                 170m                 kubelet, host-10-10-18-46     Starting kubelet.
  Normal  NodeHasSufficientMemory  170m                 kubelet, host-10-10-18-46     Node host-10-10-18-46 status is now: NodeHasSufficientMemory
  Normal  NodeHasNoDiskPressure    170m                 kubelet, host-10-10-18-46     Node host-10-10-18-46 status is now: NodeHasNoDiskPressure
  Normal  NodeHasSufficientPID     170m                 kubelet, host-10-10-18-46     Node host-10-10-18-46 status is now: NodeHasSufficientPID
  Normal  NodeAllocatableEnforced  170m                 kubelet, host-10-10-18-46     Updated Node Allocatable limit across pods
  Normal  Starting                 166m                 kube-proxy, host-10-10-18-46  Starting kube-proxy.
  Normal  Starting                 34m                  kubelet, host-10-10-18-46     Starting kubelet.
  Normal  NodeAllocatableEnforced  34m                  kubelet, host-10-10-18-46     Updated Node Allocatable limit across pods
  Normal  NodeHasSufficientMemory  34m (x8 over 34m)    kubelet, host-10-10-18-46     Node host-10-10-18-46 status is now: NodeHasSufficientMemory
  Normal  NodeHasNoDiskPressure    34m (x8 over 34m)    kubelet, host-10-10-18-46     Node host-10-10-18-46 status is now: NodeHasNoDiskPressure
  Normal  NodeHasSufficientPID     34m (x7 over 34m)    kubelet, host-10-10-18-46     Node host-10-10-18-46 status is now: NodeHasSufficientPID
  Normal  Starting                 10m                  kubelet, host-10-10-18-46     Starting kubelet.
  Normal  NodeAllocatableEnforced  10m                  kubelet, host-10-10-18-46     Updated Node Allocatable limit across pods
  Normal  NodeHasSufficientMemory  10m (x8 over 10m)    kubelet, host-10-10-18-46     Node host-10-10-18-46 status is now: NodeHasSufficientMemory
  Normal  NodeHasNoDiskPressure    10m (x8 over 10m)    kubelet, host-10-10-18-46     Node host-10-10-18-46 status is now: NodeHasNoDiskPressure
  Normal  NodeHasSufficientPID     10m (x7 over 10m)    kubelet, host-10-10-18-46     Node host-10-10-18-46 status is now: NodeHasSufficientPID
[root@host-10-10-18-46 ~]# kubectl describe node  host-10-10-18-46 | grep  Taints
Taints:             node.kubernetes.io/not-ready:NoSchedule
[root@host-10-10-18-46 ~]# 
[root@host-10-10-18-46 ~]# kubectl taint node host-10-10-18-46 node-role.kubernetes.io/master:NoSchedule-
error: taint "node-role.kubernetes.io/master:NoSchedule" not found
[root@host-10-10-18-46 ~]# kubectl describe nodes  |grep Taints
Taints:             node.kubernetes.io/not-ready:NoSchedule
[root@host-10-10-18-46 ~]# 

可以看到最后的方式为NoSchedule,可以通过kubectl taint命令进行设定如下三种方式,具体说明如下:

  • NoSchedule: 不调度
  • PreferNoSchedule: 尽量不调度
  • NoExecute: 不调度并且立即驱逐节点上现存pod
[root@host-10-10-18-46 ~]# kubectl describe node  host-10-10-18-46
Name:               host-10-10-18-46
Roles:              master
Labels:             beta.kubernetes.io/arch=arm64
                    beta.kubernetes.io/os=linux
                    kubernetes.io/arch=arm64
                    kubernetes.io/hostname=host-10-10-18-46
                    kubernetes.io/os=linux
                    node-role.kubernetes.io/master=
Annotations:        kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
                    node.alpha.kubernetes.io/ttl: 0
                    volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp:  Wed, 30 Jun 2021 12:03:35 +0800
Taints:             node.kubernetes.io/not-ready:NoSchedule
Unschedulable:      false
Lease:
  HolderIdentity:  host-10-10-18-46
  AcquireTime:     <unset>
  RenewTime:       Wed, 30 Jun 2021 14:54:05 +0800
Conditions:
  Type             Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message
  ----             ------  -----------------                 ------------------                ------                       -------
  MemoryPressure   False   Wed, 30 Jun 2021 14:49:22 +0800   Wed, 30 Jun 2021 12:03:35 +0800   KubeletHasSufficientMemory   kubelet has sufficient memory available
  DiskPressure     False   Wed, 30 Jun 2021 14:49:22 +0800   Wed, 30 Jun 2021 12:03:35 +0800   KubeletHasNoDiskPressure     kubelet has no disk pressure
  PIDPressure      False   Wed, 30 Jun 2021 14:49:22 +0800   Wed, 30 Jun 2021 12:03:35 +0800   KubeletHasSufficientPID      kubelet has sufficient PID available
  Ready            False   Wed, 30 Jun 2021 14:49:22 +0800   Wed, 30 Jun 2021 12:03:35 +0800   KubeletNotReady              runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
Addresses:
  InternalIP:  10.10.18.46
  Hostname:    host-10-10-18-46
Capacity:
  cpu:                4
  ephemeral-storage:  7978Mi
  hugepages-2Mi:      0
  hugepages-512Mi:    0
  memory:             7756672Ki
  pods:               110
Allocatable:
  cpu:                4
  ephemeral-storage:  7528985383
  hugepages-2Mi:      0
  hugepages-512Mi:    0
  memory:             7654272Ki
  pods:               110
System Info:
  Machine ID:                 30689d599b59462f9fee88051771bea5
  System UUID:                B80706BA-B199-4ED2-927B-66A6EC045417
  Boot ID:                    3205f1fc-6015-4fcd-a9c1-c9c24e2d8d80
  Kernel Version:             4.14.0-115.el7a.0.1.aarch64
  OS Image:                   CentOS Linux 7 (AltArch)
  Operating System:           linux
  Architecture:               arm64
  Container Runtime Version:  docker://20.10.7
  Kubelet Version:            v1.18.1
  Kube-Proxy Version:         v1.18.1
Non-terminated Pods:          (4 in total)
  Namespace                   Name                                        CPU Requests  CPU Limits  Memory Requests  Memory Limits  AGE
  ---------                   ----                                        ------------  ----------  ---------------  -------------  ---
  kube-system                 kube-apiserver-host-10-10-18-46             250m (6%)     0 (0%)      0 (0%)           0 (0%)         169m
  kube-system                 kube-controller-manager-host-10-10-18-46    200m (5%)     0 (0%)      0 (0%)           0 (0%)         170m
  kube-system                 kube-proxy-zl8fw                            0 (0%)        0 (0%)      0 (0%)           0 (0%)         166m
  kube-system                 kube-scheduler-host-10-10-18-46             100m (2%)     0 (0%)      0 (0%)           0 (0%)         170m
Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource           Requests    Limits
  --------           --------    ------
  cpu                550m (13%)  0 (0%)
  memory             0 (0%)      0 (0%)
  ephemeral-storage  0 (0%)      0 (0%)
  hugepages-2Mi      0 (0%)      0 (0%)
  hugepages-512Mi    0 (0%)      0 (0%)
Events:
  Type    Reason                   Age                  From                          Message
  ----    ------                   ----                 ----                          -------
  Normal  Starting                 171m                 kubelet, host-10-10-18-46     Starting kubelet.
  Normal  NodeAllocatableEnforced  171m                 kubelet, host-10-10-18-46     Updated Node Allocatable limit across pods
  Normal  NodeHasSufficientMemory  171m (x5 over 171m)  kubelet, host-10-10-18-46     Node host-10-10-18-46 status is now: NodeHasSufficientMemory
  Normal  NodeHasNoDiskPressure    171m (x4 over 171m)  kubelet, host-10-10-18-46     Node host-10-10-18-46 status is now: NodeHasNoDiskPressure
  Normal  NodeHasSufficientPID     171m (x4 over 171m)  kubelet, host-10-10-18-46     Node host-10-10-18-46 status is now: NodeHasSufficientPID
  Normal  Starting                 170m                 kubelet, host-10-10-18-46     Starting kubelet.
  Normal  NodeHasSufficientMemory  170m                 kubelet, host-10-10-18-46     Node host-10-10-18-46 status is now: NodeHasSufficientMemory
  Normal  NodeHasNoDiskPressure    170m                 kubelet, host-10-10-18-46     Node host-10-10-18-46 status is now: NodeHasNoDiskPressure
  Normal  NodeHasSufficientPID     170m                 kubelet, host-10-10-18-46     Node host-10-10-18-46 status is now: NodeHasSufficientPID
  Normal  NodeAllocatableEnforced  170m                 kubelet, host-10-10-18-46     Updated Node Allocatable limit across pods
  Normal  Starting                 166m                 kube-proxy, host-10-10-18-46  Starting kube-proxy.
  Normal  Starting                 34m                  kubelet, host-10-10-18-46     Starting kubelet.
  Normal  NodeAllocatableEnforced  34m                  kubelet, host-10-10-18-46     Updated Node Allocatable limit across pods
  Normal  NodeHasSufficientMemory  34m (x8 over 34m)    kubelet, host-10-10-18-46     Node host-10-10-18-46 status is now: NodeHasSufficientMemory
  Normal  NodeHasNoDiskPressure    34m (x8 over 34m)    kubelet, host-10-10-18-46     Node host-10-10-18-46 status is now: NodeHasNoDiskPressure
  Normal  NodeHasSufficientPID     34m (x7 over 34m)    kubelet, host-10-10-18-46     Node host-10-10-18-46 status is now: NodeHasSufficientPID
  Normal  Starting                 10m                  kubelet, host-10-10-18-46     Starting kubelet.
  Normal  NodeAllocatableEnforced  10m                  kubelet, host-10-10-18-46     Updated Node Allocatable limit across pods
  Normal  NodeHasSufficientMemory  10m (x8 over 10m)    kubelet, host-10-10-18-46     Node host-10-10-18-46 status is now: NodeHasSufficientMemory
  Normal  NodeHasNoDiskPressure    10m (x8 over 10m)    kubelet, host-10-10-18-46     Node host-10-10-18-46 status is now: NodeHasNoDiskPressure
  Normal  NodeHasSufficientPID     10m (x7 over 10m)    kubelet, host-10-10-18-46     Node host-10-10-18-46 status is now: NodeHasSufficientPID
 runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized

安装flannel后解决
[root@host-10-10-18-46 pki]# kubectl get nodes
NAME               STATUS   ROLES    AGE     VERSION
host-10-10-18-46   Ready    master   3h54m   v1.18.1


[root@host-10-10-18-46 pki]# kubectl get pods -o wide -n kube-system
NAME                                       READY   STATUS              RESTARTS   AGE     IP            NODE               NOMINATED NODE   READINESS GATES
coredns-546565776c-v49kt                   0/1     ContainerCreating   0          75m     <none>        host-10-10-18-46   <none>           <none>
coredns-546565776c-z5pq6                   0/1     ContainerCreating   0          75m     <none>        host-10-10-18-46   <none>           <none>
kube-apiserver-host-10-10-18-46            1/1     Running             64         3h59m   10.10.18.46   host-10-10-18-46   <none>           <none>
kube-controller-manager-host-10-10-18-46   1/1     Running             51         3h59m   10.10.18.46   host-10-10-18-46   <none>           <none>
kube-flannel-ds-arm64-x7mnq                1/1     Running             13         43m     10.10.18.46   host-10-10-18-46   <none>           <none>
kube-proxy-zl8fw                           1/1     Running             0          3h55m   10.10.18.46   host-10-10-18-46   <none>           <none>
kube-scheduler-host-10-10-18-46            1/1     Running             52         3h59m   10.10.18.46   host-10-10-18-46   <none>           <none>
 

加入其它master

   token没有过期

 如果没有--discovery-token-ca-cert-hash值,也可以通过以下命令获取
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

  • 如果是过期了,需要重新生成

1. 执行kubeadm token create --print-join-command,重新生成,重新生成基础的 join 命令(对于添加 master 节点还需要重新生成certificate-key,见下一步)
# 如果是添加 worker 节点,不需要执行这一步,直接使用上面返回的 join 命令加入集群。
2. 使用 kubeadm init phase upload-certs --experimental-upload-certs 重新生成certificate-key
# 添加 master 节点:用上面第1步生成的 join 命令和第2步生成的--certificate-key 值拼接起来执行
 

新增Master节点额外需要certificate-key参数,使用以下命令生成:

# 生成certificate-key
kubeadm init phase upload-certs --upload-certs

# 使用Node节点的join命令并且拼上--control-plane --certificate-key参数
kubeadm join kubernetes-vip:9443 --token bayqt8.eaafmfthasquy4yn --discovery-token-ca-cert-hash sha256:250115fad0a4b6852a919dbba4222ac65bc64843c660363ab119606ff8819d0a --control-plane --certificate-key bfd5bc7ff4aa54e1cba9a5979210c06ae087ae6fb9979af8f851554638889d7b
[root@host-10-10-18-46 ~]# kubeadm token list
TOKEN                     TTL         EXPIRES                     USAGES                   DESCRIPTION                                                EXTRA GROUPS
abcdef.0123456789abcdef   20h         2021-07-01T12:03:42+08:00   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token
[root@host-10-10-18-46 ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
9bc0bcddb2b97791717943b714ffa410cb5963061889086f04eda6150cb590fc
[root@host-10-10-18-46 ~]# kubeadm init phase upload-certs --upload-certs
I0630 15:34:33.032985    8128 version.go:252] remote version is much newer: v1.21.2; falling back to: stable-1.18
W0630 15:34:34.097393    8128 configset.go:202] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
[upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace
[upload-certs] Using certificate key:
8c94eb58dfdfc88b2f949d59f7f4348984dc0b155e37488a2f95df7048ca7374
[root@host-10-10-18-46 ~]# kubeadm token list
TOKEN                     TTL         EXPIRES                     USAGES                   DESCRIPTION                                                EXTRA GROUPS
abcdef.0123456789abcdef   20h         2021-07-01T12:03:42+08:00   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token
s7li41.5u78f4i2oqfg4t1c   1h          2021-06-30T17:34:43+08:00   <none>                   Proxy for managing TTL for the kubeadm-certs secret        <none>
[root@host-10-10-18-46 ~]#
[root@host-10-10-18-46 ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
9bc0bcddb2b97791717943b714ffa410cb5963061889086f04eda6150cb590fc
[root@host-10-10-18-46 ~]#

拷贝秘钥

scp ca.* sa.* front-proxy-ca.* root@10.10.18.45:/etc/kubernetes/pki/

证书失效管理

从0到1,手把手教你入门 etcd

部署高可用集群

kubernetes 集群安装(kubeadm)

KunPeng平台 Cfssl 1.4.1版本移植安装指南

原文地址:https://www.cnblogs.com/dream397/p/14949308.html