# kubernetes集群(ubuntu)

ubuntu18.04虚拟机安装kubernetes集群 官网 https://kubernetes.io/zh-cn/#

# 1. 初始化虚拟机配置

  1. 使用free -h查看交换空间是否关闭,如果交换空间未关闭(swap)则使用swapoff -a进行关闭。

image-20210126114917803

  1. 开机禁止启动交换空间,如果内容包含swap则注释掉。

    vi /etc/fstab

image-20210126115252651

  1. 关闭防火墙

    ufw disable

  2. 配置dns,vi /etc/systemd/resolved.conf配置完重启电脑reboot

    image-20210126115637796

  3. 修改 cloud.cfg,如果有vi /etc/cloud/cloud.cfg

    image-20210126131602246

  4. 设置时区

    dpkg-reconfigure tzdata
    选择亚洲 Asia->Shanghai
    # 安装 ntpdate
    apt-get install ntpdate
    
    # 设置系统时间与网络时间同步(cn.pool.ntp.org 位于中国的公共 NTP 服务器)
    ntpdate cn.pool.ntp.org
    
    # 将系统时间写入硬件时间
    hwclock --systohc
    
    # 确认时间
    date
    
  5. 配置 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
  1. 启用IPVS

    bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
    
  2. 配置内核参数

    # 配置参数
    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

image-20210126134335750

vim /etc/resolv.conf
nameserver 114.114.114.114
nameserver 8.8.8.8

# 重启网络
sudo /etc/init.d/networking restart
# 重启电脑
reboot

image-20210126134422205

# 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

image-20210126134603392

# 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: {}

image-20210126134956236

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

image-20210126135032678

# 5 初始化kubeadm

kubeadm init --config=kubeadm.yml --upload-certs | tee kubeadm-init.log

image-20210126135149483

配置 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

image-20210126135221737

# 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下边是加入成的界面

image-20210126135520005

image-20210126135609016

# 在master查看
kubectl get node

image-20210126135706981

# 查看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> 即可生效。(默认生效)

image-20210126141701093

# 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

image-20210126142513628

#上传文件测试
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 方便访问

image-20210126143527325

# 部署
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/

image-20210126143608655

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

image-20210126143626237

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}')  

image-20210126143716739

image-20210126143726409

# 问题记录

  1. k8s镜像问题 https

  1. 从节点无法使用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_profile
    
    
  2. coredns是pending状态

网卡没启动

# 高可用集群准备工作

# 基于kubernetes-master 创建以上几个服务,修改主机名及ip

image-20210126152403660

# 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

image-20210126152440879

赋值权限

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

image-20210126152847466

设置权限

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

image-20210126152901384

在192.168.117.151 master02服务器查看拷贝的文件

image-20210126152915333

# 6分别在 3 个 Master 中启动容器(执行脚本)

sh /usr/local/kubernetes/lb/start-haproxy.sh && sh /usr/local/kubernetes/lb/start-keepalived.sh

image-20210126152935495

# 7验证三个master是否成功

docker ps

image-20210126152952467

# 8查看网卡绑定的虚拟 IP

ip a | grep ens33

image-20210126153017275

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

image-20210126153039281