# kubernetes集群(ubuntu)
ubuntu18.04虚拟机安装kubernetes集群 官网 https://kubernetes.io/zh-cn/#
# 1. 初始化虚拟机配置
- 使用
free -h查看交换空间是否关闭,如果交换空间未关闭(swap)则使用swapoff -a进行关闭。

开机禁止启动交换空间,如果内容包含swap则注释掉。
vi /etc/fstab

关闭防火墙
ufw disable配置dns,
vi /etc/systemd/resolved.conf配置完重启电脑reboot
修改 cloud.cfg,如果有
vi /etc/cloud/cloud.cfg
设置时区
dpkg-reconfigure tzdata 选择亚洲 Asia->Shanghai # 安装 ntpdate apt-get install ntpdate # 设置系统时间与网络时间同步(cn.pool.ntp.org 位于中国的公共 NTP 服务器) ntpdate cn.pool.ntp.org # 将系统时间写入硬件时间 hwclock --systohc # 确认时间 date配置 IPVS
# 安装系统工具
apt-get install -y ipset ipvsadm
# 配置并加载 IPVS 模块
mkdir -p /etc/sysconfig/modules/
vi /etc/sysconfig/modules/ipvs.modules
# 输入如下内容
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
# 执行脚本,注意:如果重启则需要重新运行该脚本
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
启用IPVS
bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4配置内核参数
# 配置参数 vi /etc/sysctl.d/k8s.conf # 输入如下内容 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_nonlocal_bind = 1 net.ipv4.ip_forward = 1 vm.swappiness=0 # 应用参数 sysctl --system
# 2 安装kubeadm
Kubeadm (一键安装k8s) ,kubelet(启动容器),kubectl(命令行工具)
lsb_release -a 系统代号
# 安装系统工具
apt-get update && apt-get install -y apt-transport-https
# 安装 GPG 证书
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
# 写入软件源;注意:我们用系统代号为 bionic,但目前阿里云不支持,所以沿用 16.04 的 xenial
# url用https无法下载
cat << EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
# 安装
apt-get update
apt-get install -y kubelet kubeadm kubectl
# 设置 kubelet 自启动,并启动 kubelet
systemctl enable kubelet && systemctl start kubelet
# 3. 修改主机名和IP
# 1修改主机名
# 查看当前主机名
hostnamectl
# 使用 hostnamectl 命令修改,其中 kubernetes-master 为新的主机名
hostnamectl set-hostname kubernetes-master
#每次新建的从节点每次都要更新下docker,确保正常pull
# 2配置固定IP
# 16.04修改固定ip
# 参考 https://blog.csdn.net/davidhzq/article/details/102991577
vim /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto ens33
# static表示设置静态IP,动态IP用dhcp,一般默认就是dhcp状态
iface ens33 inet static
#IP地址
address 192.168.117.150
#子网掩码
netmask 255.255.255.0
#网关
gateway 192.168.117.2
dns-nameservers 192.168.117.2
#广播地址,可以不设
broadcast 192.168.1.255

vim /etc/resolv.conf
nameserver 114.114.114.114
nameserver 8.8.8.8
# 重启网络
sudo /etc/init.d/networking restart
# 重启电脑
reboot

# 18.04修改固定ip
vim /etc/netplan/50-cloud-init.yaml
network:
ethernets:
ens33:
addresses: [192.168.117.131/24]
gateway4: 192.168.117.2
nameservers:
addresses: [192.168.117.2]
version: 2
# 应用
netplan apply
# 如果不能联网
vi /etc/resolv.conf
nameserver 114.114.114.114
# 这个文件系统会自动重写,停止重写该文件
systemctl stop systemd-resolved
# 4.配置kubeadm
# 配置时只需要在master上配置即可
cd /usr/local/docker
mkdir kubernetes
# 导出配置文件
kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml
# 编辑文件
vi kubeadm.yml
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
# 修改为主节点 IP
advertiseAddress: 192.168.117.136
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: kubernetes-master
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: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
# 修改版本号
kubernetesVersion: v1.17.2
networking:
dnsDomain: cluster.local
# 配置成 Calico 的默认网段192.168.0.0/16 Flannel 默认网段
podSubnet: "10.244.0.0/16"
serviceSubnet: 10.96.0.0/12
scheduler: {}

# 查看所需镜像列表
kubeadm config images list --config kubeadm.yml
# 拉取镜像
kubeadm config images pull --config kubeadm.yml
# 查看镜像
docker images

# 5 初始化kubeadm
kubeadm init --config=kubeadm.yml --upload-certs | tee kubeadm-init.log

配置 kubectl
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# 非 ROOT 用户执行
chown $(id -u):$(id -g) $HOME/.kube/config
# 验证是否成功,打印出信息则成功
kubectl get node

# 5.1 解决Node无法加入问题
rm -rf /var/lib/etcd (待查看)
# 从节点加不进去,需要kubeadm reset 再重新join即可
kubeadm reset
y
rm -rf kubeadm-init.log
# 然后重新安装即可
# 如果重新配置完kubectl get node 命令不可用,则重新执行
# 在根目录删除./kube
rm -fr ~/.kube/
kubeadm init --config=kubeadm.yml --upload-certs | tee kubeadm-init.log
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# 启用IPVS
bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
# 6 配置node
# 基于kubernetes-master创建Kubernetes node01
192.168.117.138
# 1修改主机名
hostnamectl set-hostname kubernetes-node-01
# 2加入master,选择下边的,红框是加入master集群,加入命令在master服务中
# 3下边是加入成的界面


# 在master查看
kubectl get node
# 查看token
kubeadm token list
# 生成新token
kubeadm token create
# 查看sha256
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
# 如果从节点配错了删不掉,需要回master服务器
kubectl delete nodes kubernetes-node01
# 在master查看是否删除
kubectl get node
# 7 配置网络插件flannel
# 参考 https://blog.csdn.net/nhfc99/article/details/112763257
vim /etc/hosts
# GitHub Start
192.30.253.112 github.com
199.232.28.133 raw.githubusercontent.com
# GitHub End
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
# 8 运行容器
cd /usr/local/docker/kubernetes
vim nginx.yml
# API 版本号:由 extensions/v1beta1 修改为 apps/v1
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app
spec:
# 增加了选择器配置
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
# 设置标签由 name 修改为 app
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-http
spec:
ports:
- port: 80
targetPort: 80
type: LoadBalancer
selector:
# 标签选择器由 name 修改为 app
app: nginx
# 9 修改默认的端口范围
# Kubernetes 服务的 NodePort 默认端口范围是 30000-32767,在某些场合下,这个限制不太适用,我们可以自定义它的端口范围
vi /etc/kubernetes/manifests/kube-apiserver.yaml
#增加配置
--service-node-port-range=2-65535
#使用 docker ps 命令找到 kube-apiserver 容器,再使用 docker restart <ApiServer 容器 ID> 即可生效。(默认生效)

# 10 Ingress 统一访问入口
# 1 修改type: ClusterIP,master可以访问到,本机访问有问题
# 这里以nginx为例
# API 版本号:由 extensions/v1beta1 修改为 apps/v1
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app
spec:
# 增加了选择器配置
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
# 设置标签由 name 修改为 app
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-http
spec:
ports:
- port: 80
targetPort: 80
type: ClusterIP
selector:
# 标签选择器由 name 修改为 app
app: nginx
# 2安装 Nginx Ingress Controller
# 参考https://github.com/WillLiaowh/k8s/blob/master/mandatory.yaml
vim mandatory.yaml
#启动
kubectl create -f mandatory.yaml
#查看是否启动
watch kubectl get pods --all-namespaces
#查看是否启动,部署在哪个node上
kubectl get pods -n ingress-nginx -o wide
# 3部署 Ingress(以nginx为例)
vim ingress.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-web
annotations:
# 指定 Ingress Controller 的类型
kubernetes.io/ingress.class: "nginx"
# 指定我们的 rules 的 path 可以使用正则表达式
nginx.ingress.kubernetes.io/use-regex: "true"
# 连接超时时间,默认为 5s
nginx.ingress.kubernetes.io/proxy-connect-timeout: "600"
# 后端服务器回转数据超时时间,默认为 60s
nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
# 后端服务器响应超时时间,默认为 60s
nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
# 客户端上传文件,最大大小,默认为 20m
nginx.ingress.kubernetes.io/proxy-body-size: "10m"
# URL 重写
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
# 路由规则
rules:
# 主机名,只能是域名,修改为你自己的
- host: k8s.test.com
http:
paths:
- path: /
pathType: Prefix
backend:
# 后台部署的 Service Name,与上面部署的 Tomcat 对应
service:
name: nginx-http
# 后台部署的 Service Port,与上面部署的 Tomcat 对应
port:
number: 80
#启动
kubectl create -f ingress.yml
#查看是否启动
kubectl get ingress
# 11 准备数据持久化(nfs分布式文件系统)
#pv 和pvc 区别
pv 负责规划资源 20G的硬盘pv负责分配5g给mysql
pvc负责分配 pvc负责将2g给order服务,1g给admin服务
#基于kubernetes-master 创建服务kubernetes-volumes
#修改主机名kubernetes-volumes
#设置ip为192.168.254.140
#1 创建共享文件目录
mkdir -p /usr/local/kubernetes/volumes
#2给目录增加读写权限
chmod a+rw /usr/local/kubernetes/volumes
#3更新数据源
# centos
yum makecache
# ubuntu
apt-get update
#4安装 NFS 服务端 PV
#centos
安装nfs
sudo yum install nfs-utils
启动nfs服务
sudo systemctl start nfs-server
设置开机自启动
sudo systemctl enable nfs-server
# ubuntu
apt-get install -y nfs-kernel-server
#5设置nfs目录访问权限,在最下边添加
vim /etc/exports
/usr/local/kubernetes/volumes *(rw,sync,no_subtree_check,no_root_squash)
#6 重启使配置生效
centos
sudo exportfs -ra
ubuntu
/etc/init.d/nfs-kernel-server restart
#7安装 NFS 客户端 PVC(ubuntu执行)
apt-get install -y nfs-common
#8创建 NFS 客户端挂载目录
mkdir -p /usr/local/kubernetes/volumes-mount
#9将NFS 服务器的 /usr/local/kubernetes/volumes 目录挂载到 NFS 客户端的 /usr/local/kubernetes/volumes-mount 目录
#Ip为服务器的ip 即pv部署的ip nfs部署的ip172.17.110.249
mount 192.168.111.140:/usr/local/kubernetes/volumes /usr/local/kubernetes/volumes-mount
#查看挂载的信息 df -h

#上传文件测试
ip addr > /usr/local/kubernetes/volumes-mount/test1.txt
查看 /usr/local/kubernetes/volumes 目录下是否有 test.txt 文件,有则表示成功
#取消nfs客户端挂载
umount /usr/local/kubernetes/volumes-mount
# 12 ConfigMap
# 写io比较慢,实际上已经在同步
# 参考博客 https://www.jianshu.com/p/1b001bf901c6
cd /usr/local/docker/kubernetes/volumes
# 创建pv
vim nfs-pv-mysql.yml
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv-mysql
spec:
# 设置容量
capacity:
storage: 5Gi
# 访问模式
accessModes:
# 该卷能够以读写模式被多个节点同时加载
- ReadWriteMany
# 回收策略,这里是基础擦除 `rm-rf/thevolume/*`
persistentVolumeReclaimPolicy: Recycle
nfs:
# NFS 服务端配置的路径
path: "/usr/local/kubernetes/volumes"
# NFS 服务端地址
server: 192.168.141.140
readOnly: false
# 部署
kubectl create -f nfs-pv-mysql.yml
# 删除
kubectl delete -f nfs-pv-mysql.yml
# 查看
kubectl get pv
# 创建pvc
vim nfs-pvc-mysql-myshop.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc-mysql-myshop
spec:
accessModes:
# 需要使用和 PV 一致的访问模式
- ReadWriteMany
# 按需分配资源
resources:
requests:
storage: 1Gi
# 部署
kubectl create -f nfs-pvc-mysql-myshop.yml
# 删除
kubectl delete -f nfs-pvc-mysql-myshop.yml
# 查看
kubectl get pvc
vim mysql.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-myshop-config
data:
# 这里是键值对数据
mysqld.cnf: |
[client]
port=3306
[mysql]
no-auto-rehash
[mysqld]
skip-host-cache
skip-name-resolve
default-authentication-plugin=mysql_native_password
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
explicit_defaults_for_timestamp=true
lower_case_table_names=1
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: mysql-myshop
spec:
replicas: 1
template:
metadata:
labels:
name: mysql-myshop
spec:
containers:
- name: mysql-myshop
image: mysql
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
volumeMounts:
# 以数据卷的形式挂载 MySQL 配置文件目录
- name: cm-vol-myshop
mountPath: /etc/mysql/conf.d
- name: nfs-vol-myshop
mountPath: /var/lib/mysql
volumes:
# 将 ConfigMap 中的内容以文件形式挂载进数据卷
- name: cm-vol-myshop
configMap:
name: mysql-myshop-config
items:
# ConfigMap 中的 Key
- key: mysqld.cnf
# ConfigMap Key 匹配的 Value 写入名为 mysqld.cnf 的文件中
path: mysqld.cnf
- name: nfs-vol-myshop
persistentVolumeClaim:
claimName: nfs-pvc-mysql-myshop
---
apiVersion: v1
kind: Service
metadata:
name: mysql-myshop
spec:
ports:
- port: 3306
targetPort: 3306
nodePort: 32036
type: LoadBalancer
selector:
name: mysql-myshop
# 13 Dashboard 仪表盘
# 下载
wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
vim kubernetes-dashboard.yaml
#修改文件
镜像修改为阿里云 registry.aliyuncs.com/google_containers
设置NodePort 方便访问

# 部署
kubectl create -f kubernetes-dashboard.yaml
# 查看
kubectl -n kube-system get pods
kubectl -n kube-system get service kubernetes-dashboard
kubectl -n kube-system describe service kubernetes-dashboard
查看部署到哪个node上
https://192.168.254.154:30001/

高级—接受并继续,选择以令牌方式登陆

vim dashboard-adminuser.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kube-system
#启动程序
kubectl create -f dashboard-adminuser.yaml
#打印token信息
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')


# 问题记录
- k8s镜像问题 https

从节点无法使用kubectl get pod问题
The connection to the server localhost:8080 was refused - did you specify the right host or port?
https://blog.csdn.net/Alex_Sheng_Sea/article/details/107188845
# 将主节点/etc/kubernetes/admin.conf文件拷贝到从节点对应目录 #配置环境变量 echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile # 立即生效 source ~/.bash_profilecoredns是pending状态
网卡没启动
# 高可用集群准备工作
# 基于kubernetes-master 创建以上几个服务,修改主机名及ip

# master01安装 HAProxy + Keepalived
# 1创建 HAProxy 启动脚本
mkdir -p /usr/local/kubernetes/lb
vi /usr/local/kubernetes/lb/start-haproxy.sh
#!/bin/bash
# 修改为你自己的 Master 地址
MasterIP1=192.168.117.150
MasterIP2=192.168.117.151
MasterIP3=192.168.117.152
# 这是 kube-apiserver 默认端口,不用修改
MasterPort=6443
# 容器将 HAProxy 的 6444 端口暴露出去
docker run -d --restart=always --name HAProxy-K8S -p 6444:6444 \
-e MasterIP1=$MasterIP1 \
-e MasterIP2=$MasterIP2 \
-e MasterIP3=$MasterIP3 \
-e MasterPort=$MasterPort \
wise2c/haproxy-k8s

赋值权限
cd /usr/local/kubernetes/lb/
chmod +x start-haproxy.sh
# 2创建 Keepalived 启动脚本
vi /usr/local/kubernetes/lb/start-keepalived.sh
# 输入内容如下
#!/bin/bash
# 修改为你自己的虚拟 IP 地址
VIRTUAL_IP=192.168.117.200
# 虚拟网卡设备名
INTERFACE=ens33
# 虚拟网卡的子网掩码
NETMASK_BIT=24
# HAProxy 暴露端口,内部指向 kube-apiserver 的 6443 端口
CHECK_PORT=6444
# 路由标识符
RID=10
# 虚拟路由标识符
VRID=160
# IPV4 多播地址,默认 224.0.0.18
MCAST_GROUP=224.0.0.18
docker run -itd --restart=always --name=Keepalived-K8S \
--net=host --cap-add=NET_ADMIN \
-e VIRTUAL_IP=$VIRTUAL_IP \
-e INTERFACE=$INTERFACE \
-e CHECK_PORT=$CHECK_PORT \
-e RID=$RID \
-e VRID=$VRID \
-e NETMASK_BIT=$NETMASK_BIT \
-e MCAST_GROUP=$MCAST_GROUP \
wise2c/keepalived-k8s

设置权限
chmod +x start-keepalived.sh
# 4在master02和master03上创建文件
mkdir -p /usr/local/kubernetes/lb
# 5将 kubernetes-master-01 中的脚本拷贝至其它 Master
scp start-haproxy.sh start-keepalived.sh 192.168.117.151:/usr/local/kubernetes/lb
scp start-haproxy.sh start-keepalived.sh 192.168.117.152:/usr/local/kubernetes/lb
yes

在192.168.117.151 master02服务器查看拷贝的文件
# 6分别在 3 个 Master 中启动容器(执行脚本)
sh /usr/local/kubernetes/lb/start-haproxy.sh && sh /usr/local/kubernetes/lb/start-keepalived.sh

# 7验证三个master是否成功
docker ps

# 8查看网卡绑定的虚拟 IP
ip a | grep ens33

Keepalived 会对 HAProxy 监听的 6444 端口进行检测,如果检测失败即认定本机 HAProxy 进程异常,会将 VIP 漂移到其他节点,所以无论本机 Keepalived 容器异常或 HAProxy 容器异常都会导致 VIP 漂移到其他节点
# 10部署 Kubernetes 集群
# 1初始化master
# 创建工作目录
mkdir -p /usr/local/kubernetes/cluster
cd /usr/local/kubernetes/cluster/
# 导出配置文件到工作目录
kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml
# 2配置kubeadm
vi kubeadm.yml
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
# 修改为主节点 IP
advertiseAddress: 192.168.117.150
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: kubernetes-master-01
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
# 配置 Keepalived 地址和 HAProxy 端口
controlPlaneEndpoint: "192.168.117.200:6444"
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
# 国内不能访问 Google,修改为阿里云
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.17.0
networking:
dnsDomain: cluster.local
# 配置成 Calico 的默认网段
podSubnet: "192.168.0.0/16"
serviceSubnet: 10.96.0.0/12
scheduler: {}
---
# 开启 IPVS 模式
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
SupportIPVSProxyMode: true
mode: ipvs
# 3初始化kubeadm参考2-3
# 4配置网络Calico参考6
# 5将02和03加入master
从 kubeadm-init.log 中获取命令,分别将 kubernetes-master-02 和 kubernetes-master-03 加入 Master
分别在02和03执行如下命令
kubeadm join 192.168.117.200:6444 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:2f8daf012e8bad52030b9f4ecd07b6f6e929a8fd7bca63906bbc3c5aedf78883 \
--control-plane --certificate-key 3e9f43d704edad8d91d4539e38fd7c7ca2bf1bb4cfa1adb29367681a7081fa62
在master查看
kubectl get node