一 、在阿里部署的想法 

    在部署之前搜索过很多的资料技术站都没有找到一份详细的阿里云部署k8s集群的详细文档,有些是部署了一部分,有些是部署了单个应用,都不连贯,今天大胆尝试下完整连贯的部署k8s。因为本地部署和云上部署k8s环境略有不同,在云上部署k8s在到集群高可用时会出现HA的虚拟ip无法生成的问题,在阿里云测试的专有网络高可用虚拟ip就可以解决这个问题。

二、集群高可用为什么需要三台master

Kubernetes 中的集群节点选举是指在高可用性配置中,确保集群中的主节点(Master)总是处于活跃状态的过程。主节点负责管理集群的状态、调度工作负载以及维护集群的健康状态。当主节点失效时,副本节点(Secondary)将会接管主节点的角色,以确保集群的持续运行。

简单来说,集群节点选举的过程是通过一种投票机制来实现的。每个节点都有一个唯一的标识符,并且它们相互之间可以通信。当主节点失效时,剩余的节点将通过投票来决定谁将成为新的主节点。节点之间的通信通常通过心跳机制来实现,以确保节点的可用性和健康状态。

为什么不能只有两台节点进行选举呢?主要的原因有以下几点:

  1. 故障容忍性:如果只有两个节点,当其中一个节点失效时,剩余的节点将无法进行选举,因为没有足够的节点来达成多数。这将导致集群的整体可用性降低。

  2. 数据一致性:在进行选举时,通常需要确保集群中的状态和数据是一致的。如果只有两个节点,可能会出现由于网络分区或其他因素导致的数据不一致性问题,进而影响选举的正确性。

  3. 高可用性:Kubernetes 集群通常会部署在具有多个节点的环境中,以确保高可用性。通过增加节点数量,可以提高集群的可用性和稳定性,从而更好地应对节点故障和其他问题。

  4. 官方推荐:etcd 官方文档推荐的 etcd 集群大小是 3, 5, 7。至于到底选择 3,5 还是 7,根据需要的容错能力而定

因此,为了确保集群的高可用性和稳定性,建议部署具有多个节点的 Kubernetes 集群,并使用适当的故障容错机制来处理节点失效的情况。

三、需要的资源
3、1 部署k8s的资源

这里我们选择阿里云的ECS以及专有网络VPC、高可用虚拟VIP以及弹性ip。

注意:因为没有用过高可用虚拟vip的用户第一次是需要申请资源的。如果没有资源的可以前往专有网络VPC找高可用虚拟vip进行申请,一般很快就可以申请下来

阿里云ECS所需资源
节点角色规格ip地址地域磁盘

master1

2核(vCPU)

4 GiB

5 Mbps
172.19.48.1华东一(杭州)

ESSD Entry云盘 

40GiB

master2

2核(vCPU)

4 GiB

5 Mbps
172.19.48.2华东一(杭州)

ESSD Entry云盘 

40GiB

master3

2核(vCPU)

4 GiB

5 Mbps
172.19.48.3华东一(杭州)

ESSD Entry云盘 

40GiB

ESSD Entry云盘 

40GiB

node1

2核(vCPU)

4 GiB

5 Mbps
172.19.48.4华东一(杭州)

ESSD Entry云盘 

40GiB

node2

2核(vCPU)

4 GiB

5 Mbps
172.19.48.5华东一(杭州)

ESSD Entry云盘 

40GiB

虚拟vip172.19.52.21弹性EIP

47.96.97.184

四、创建ECS实例
4.1 登陆或者创建阿里云账号,点击右侧直达阿里云登陆注册页面(2024阿里云-上云采购季-阿里云)登陆之后点击左上角的三条杠,选择云服务器ECS

4.2 选择地域创建实例

4.3 选择规格等参数

这里我选择的是CentOS7.9,这里看你们自己,但是建议7.5以上

因为只是部署,所以磁盘就40G就可以,当然了,磁盘规格可以自选

考虑到高效的部署,所以我们选择分配公网ip,能够更快的部署完成,如果是企业集群是不允许带着公网的,会影响安全,一般企业都是提供一个弹性ip来访问。

带宽选择按流量付费,安全组新建即可,3389不用选择,这是windows远程连接端口,我们用不上,然后就可以设置登陆密码了,涉及到集群我还是习惯统一密码,诸位随意,只要能记住就行

定时释放我设置了一天,也可以不设置,实验完成记得释放资源就行,最后的页面就是下图了,然后确认下单回到控制台就可以看到实例正在启动中(一般一两分钟都能启动完成)

控制台页面如下图

给实例改名字,以免搞混,我是根据私网ip来区分

五、创建虚拟vip以及弹性ip
5.1创建虚拟vip

还是左上角的三条杠,点击专有网络VPC

因为我已经申请过资源所以是直接创建,如果没有申请资源会提示去申请,跟着导航做就行

如果是第一次上云,建议就默认

5.2创建弹性公网ip

一定要选择好地域,不一致的地域弹性ip无法添加高可用虚拟VIP,然后就默认立即购买

这里我们不绑定资源,回到高可用虚拟ip界面去绑定

5.3添加EIP

最后的界面如下图,三个都是备这是因为我们还没有安装Keepalived,安装上就会自动选出一个主节点

六、配置ECS环境
6.1 使用远程连接工具连接到服务器(我用的Xhell)

6.2修改主机名

hostnamectl set-hostname master1  &&bash

hostnamectl set-hostname master2  &&bash

hostnamectl set-hostname master3  &&bash

hostnamectl set-hostname node1  &&bash

hostnamectl set-hostname node2  &&bash

6.3修改hosts文件(所有节点都执行)

cat > /etc/hosts <<'EOF'    #输入一下内容(注意修改自己的ip)

172.19.48.1     master1
172.19.48.2     master2
172.19.48.3     master3
172.19.48.4     node1
172.19.48.5     node2

EOF

6.3配置三台master节点免密登陆

下载命令(五台都执行,防止以后需要)

yum -y install bind-utils expect rsync wget jq psmisc vim net-tools telnet yum-utils device-mapper-persistent-data lvm2 git ntpdate lrzsz

编写脚本(三台master节点执行)

cat > password.sh << 'EOF'

#!/bin/bash
# 创建密钥对
ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa -q
# 声明你服务器密码,建议所有节点的密码均一致,否则该脚本需要再次进行优化
export mypasswd=Aa2433467934@
# 定义主机列表
k8s_host_list=(master1 master2 master3 node1 node2 )
# 配置免密登录,利用expect工具免交互输入
for i in ${k8s_host_list[@]};do
expect -c "
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$i
  expect {
    \"*yes/no*\" {send \"yes\r\"; exp_continue}
    \"*password*\" {send \"$mypasswd\r\"; exp_continue}
  }"
done

EOF

赋权 chmod +x password.sh
sh password_login.sh

第二种方式

 ssh-keygen (回车,一直回车)
 ssh-copy-id root@ip 
执行完成后可以输入ssh root@node1来验证是否不需要密码就可以登陆,登陆成功exit退出就行

6.4所有节点关闭firewalld,selinux,swap分区,fstab注释swap(所有节点都执行)

其实这步做不做都行,阿里云的机器已经关闭了,但是为了规范在执行一遍

systemctl disable --now firewalld

systemctl disable --now NetworkManager

setenforce 0

sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux

sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config

swapoff -a && sysctl -w vm.swappiness=0

sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab

free -h

6.5同步时间

先手动同步时区和时间

ln -svf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

ntpdate ntp.aliyun.com

定期任务同步("crontab -e")

*/5 * * * * /usr/sbin/ntpdate ntp.aliyun.com

6.6桥接IPV4流量到iptables的链

cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
# 允许IP转发
net.ipv4.ip_forward = 1
#允许绑定浮动IP,即VIP
#net.ipv4.ip_nonlocal_bind = 1
vm.swappiness = 0
EOF

6.7加载br_netfilter模块

modprobe br_netfilter

# 查看是否加载
lsmod | grep br_netfilter

6.8刷新命令生效

sysctl --system

6.9代理模式

kubernetes中service有两种代理模型,一种是基于iptables,另一种是基于ipvs的。ipvs的性能要高于iptables的,但是如果要使用它,需要手动载入ipvs模块

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
#modprobe -- nf_conntrack_ipv4
modprobe -- nf_conntrack #高版本内核
EOF

6.10授权和运行以及检查是否正常加载

chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

6.11检查是否加载

lsmod | grep -e ipvs -e nf_conntrack_ipv4
lsmod | grep -e ipvs -e   nf_conntrack

6.12重启服务器

reboot

七、安装docker、kubeadm、kubelet和kubectl

docker是什么?为什么k8s要用docker?他能带来什么?下面简单介绍下

Docker是一个开源的应用容器引擎,它允许开发者将应用及其依赖打包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上。容器是完全使用沙箱机制,相互之间不会有任何接口。

Kubernetes(简称K8s)是一个容器编排工具,它需要Docker的原因是Docker提供了一种轻量级、可移植的容器运行环境。K8s可以管理和编排多个Docker容器,实现应用的自动化部署、扩展、监控和维护。

Docker的主要优势包括:

  1. 更高效地利用系统资源:容器技术不需要硬件虚拟以及运行完整操作系统等额外开销,因此可以更高效地利用系统资源。
  2. 更快的启动时间:Docker由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。
  3. 一致的运行环境:Docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现环境不一致导致的问题。
  4. 持续交付和部署:Docker可以通过定制应用镜像来实现持续集成、持续交付、部署,提高了开发和运维的效率。
  5. 更轻松迁移:Docker确保了执行环境的一致性,使得应用的迁移更加容易,可以在不同的平台上运行。

总之,Docker为K8s提供了一种轻量级、可移植的容器运行环境,使得K8s可以更高效地管理和编排多个容器,实现应用的自动化部署、扩展、监控和维护。

7.1安装docker源(node节点)

自己的docker源路径(阿里云主页-文档与社区-开发者社区-下载-镜像站-容器-docker-ce)

1: 安装必要的一些系统工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2

2: 添加软件源信息 sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3:sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

4: 更新并安装Docker-CE

yum makecache fast

yum -y install docker-ce

5: 开启Docker服务 sudo service docker start

7.2创建docker镜像源加速器ACR

自己的ACR路径(阿里云主页右上方靠中间点的搜索框直接搜容器镜像服务ACR或者主页桌上角的三条杠直接搜索)

复制粘贴红框中的内容直接在node节点执行就行

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'

{

"registry-mirrors": ["https://l2gyd2xp.mirror.aliyuncs.com"]

}

EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

7.3添加k8s源

由于kubernetes的镜像源在国外,非常慢,这里切换成国内的阿里云镜像源

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

7.4下载安装kubeadm、kubelet和kubectl(所有节点)

yum install -y kubelet-1.23.9 kubeadm-1.23.9 kubectl-1.23.9

7.5 修改/etc/sysconfig/kubelet文件的内容(所有节点)

这里是为了实现Docker使用的cgroup drvier和kubelet使用的cgroup drver一致

vim /etc/sysconfig/kubelet

KUBELET_EXTRA_ARGS="--cgroup-driver=cgroupfs"
KUBE_PROXY_MODE="ipvs"

设置开机自启动(由于没有生成配置文件,集群初始化后自动启动)

systemctl enable kubelet

八、部署Keepalived+Haporxy实现master节点高可用,对apiserver做高可用

Keepalived和HAProxy可以协同工作,实现Master节点的高可用性。具体来说,Keepalived负责监控Master节点的状态,并在主Master节点出现故障时自动将虚拟IP地址(VIP)切换到备用Master节点。HAProxy则作为负载均衡器,将客户端的请求分发到可用的Master节点。

通过这种方式,当主Master节点出现故障时,Keepalived会自动将VIP切换到备用Master节点,从而确保集群的高可用性。同时,HAProxy可以将客户端的请求分发到可用的Master节点,避免了单点故障。

8.1master节点安装Keepalived

使用高可用虚拟IP(HaVip)和Keepalived实现双机主备高可用_专有网络VPC(VPC)-阿里云帮助中心 (aliyun.com) icon-default.png?t=N7T8https://help.aliyun.com/zh/vpc/user-guide/use-highly-available-virtual-ip#233a9d0442yvtyum install -y keepalived 

vim /etc/keepalived/keepalived.conf  (将里面的内容都删除)

追加以下内容(注意改自己的私网ip)

master1

! Configuration File for keepalived
vrrp_instance VI_1 {
state MASTER           #设置ECS1实例为主实例
    interface eth0          #设置网卡名,本示例配置为eth0
    virtual_router_id 51
    nopreempt
    priority 110             #设置优先级,数字越大,优先级越高,本示例配置主用实例优先级为100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    unicast_src_ip 172.19.48.1   #设置ECS实例的私网IP地址,本示例配置为192.168.0.209
    unicast_peer {
        172.19.48.2           
        172.19.48.3           #对端ECS实例的私网IP地址,本示例配置为192.168.0.210
    }
    virtual_ipaddress {
        172.19.52.21          #设置HaVip的IP地址,本示例配置为192.168.0.88
    }
    garp_master_delay 1
    garp_master_refresh 5

    track_interface {
        eth0                #设置ECS实例网卡名,本示例配置为eth0
    }
}

master2

! Configuration File for keepalived
vrrp_instance VI_1 {
state MASTER           #设置ECS1实例为主实例
    interface eth0          #设置网卡名,本示例配置为eth0
    virtual_router_id 51
    nopreempt
    priority 105             #设置优先级,数字越大,优先级越高,本示例配置主用实例优先级为100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    unicast_src_ip 172.19.48.2   #设置ECS实例的私网IP地址,本示例配置为192.168.0.209
    unicast_peer {
        172.19.48.1
        172.19.48.3           #对端ECS实例的私网IP地址,本示例配置为192.168.0.210
    }
    virtual_ipaddress {
        172.19.52.21          #设置HaVip的IP地址,本示例配置为192.168.0.88
    }
    garp_master_delay 1
    garp_master_refresh 5

    track_interface {
        eth0                #设置ECS实例网卡名,本示例配置为eth0
    }
}

master3

! Configuration File for keepalived
vrrp_instance VI_1 {
state MASTER           #设置ECS1实例为主实例
    interface eth0          #设置网卡名,本示例配置为eth0
    virtual_router_id 51
    nopreempt
    priority 100             #设置优先级,数字越大,优先级越高,本示例配置主用实例优先级为100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    unicast_src_ip 172.19.48.3   #设置ECS实例的私网IP地址,本示例配置为192.168.0.209
    unicast_peer {
        172.19.48.1
        172.19.48.2           #对端ECS实例的私网IP地址,本示例配置为192.168.0.210
    }
    virtual_ipaddress {
        172.19.52.21          #设置HaVip的IP地址,本示例配置为192.168.0.88
    }
    garp_master_delay 1
    garp_master_refresh 5

    track_interface {
        eth0                #设置ECS实例网卡名,本示例配置为eth0
    }
}

##################################################################

启动systemctl enable keepalived --now && systemctl status keepalived(master1-master2-master3依次启动)

8.2阿里云vpcHA确认是否正常

打开阿里云专有网络中的高可用虚拟vip实例详情界面刷新

这里可以看到在刷新后的页面master1成为了主节点,这是因为master1设置的参数priority为110最大,所以自动选举master1为主节点

master1节点上输入ip a命令查看,这里可以看到虚拟ip已经在master1节点上生效了

九、初始化集群
9.1部署k8smaster1节点vip

由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里需要指定阿里云镜像仓库地址

master1执行

kubeadm config print init-defaults > kubeadm-config.yaml

创建yaml配置文件初始化,修改版本以及VIP地址以及各matser,node节点IP地址

vim  kubeadm-config.yaml

apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
#注意安装的版本,注意修改

apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.23.9
controlPlaneEndpoint: 172.19.48.1:6443
imageRepository: "registry.aliyuncs.com/google_containers"
imagePullPolicy: IfNotPresent
apiServer:
 certSANs:
 - 172.19.48.1
 - 172.19.48.2
 - 172.19.48.3
 - 172.19.48.4
 - 172.19.48.5
networking:
 podSubnet: 10.200.0.0/16
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind:  KubeProxyConfiguration
mode: ipvs

9.2初始化集群

kubeadm init --config kubeadm-config.yaml

master1执行红框里的内容

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

保存第一个kubeadm生成的CA证书一会再master2和master3执行

kubeadm join 172.19.48.1:6443 --token ovwn6w.zo0w23cq6l6r6jmp \
    --discovery-token-ca-cert-hash sha256:82bdb0edf4aadff963a5f07613fe9d938a9c0fcdcfc49db0e86cc10dca0b353f \
    --control-plane

保存第二个kubeadm生成的CA证书node1和node2执行

kubeadm join 172.19.48.1:6443 --token ovwn6w.zo0w23cq6l6r6jmp \
    --discovery-token-ca-cert-hash sha256:82bdb0edf4aadff963a5f07613fe9d938a9c0fcdcfc49db0e86cc10dca0b353f

十、安装网络插件

Flannel、Calico 和 Canal 是 Kubernetes 中常用的三个网络插件,它们都提供了容器网络连接功能,但各自具有不同的特性和优势。

  1. Flannel:Flannel 是 Kubernetes 的 CNI 网络插件之一,它通过创建一个覆盖网络(overlay network)来为集群中的容器提供网络连接。Flannel 支持多种网络转发模式,如 VXLAN、HostGW 等。它的主要特点是使集群中的不同节点主机创建的 Docker 容器都具有全集群唯一的虚拟 IP 地址。Flannel 通过维护路由表,对接收到的数据进行封包和转发,从而实现了容器之间的网络通信。

  2. Calico:Calico 是 Tigera 开源的网络与网络安全解决方案,适用于容器、虚拟机、物理机等场景。Calico 支持包括 Kubernetes、OpenShift 和 OpenStack 等主流平台。在 Kubernetes 云原生容器网络方面,Calico 完全遵循 CNI 的标准。Calico 的功能更为全面,不仅提供主机和 Pod 之间的网络连接,还涉及网络安全和管理。从 Calico 3.x 版本开始,Calico 默认的模式从 BGP 调整为 IPIP,一种更加高效的 Overlay 模式。

  3. Canal:Canal 是一个基于 Flannel 和 Calico 的组合的 Kubernetes 网络解决方案。它提供了网络策略和网络隔离,使您能够在 Kubernetes 集群中轻松管理容器之间的通信。Canal 的主要特性包括网络隔离、IP 管理、高性能、灵活性和容错性。Canal 使用 Calico 来管理 Pod 的 IP 地址,支持可路由的 IP 地址池。它利用了 Linux 内核功能,提供了高性能的数据面转发。Canal 允许您根据需要自定义网络策略,以满足不同应用程序的要求。

10.1安装Calico

三台master都执行

mkdir -p /etc/docker 
cat /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": [
        "https://7mimmp7p.mirror.aliyuncs.com",
        "https://registry.docker-cn.com",
        "http://hub-mirror.c.163.com",
        "https://docker.mirrors.ustc.edu.cn"
        ],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF

重启docker

systemctl daemon-reload
systemctl restart docker

cat > /etc/NetworkManager/conf.d/calico.conf <<EOF
[keyfile]
unmanaged-devices=interface-name:cali*;interface-name:tunl*;interface-name:vxlan.calico;interface-name:wireguard.cali
EOF

master1执行

wget https://docs.projectcalico.org/v3.23/manifests/calico.yaml --no-check-certificate

cat calico.yaml |grep 'image:'
sed -i 's#docker.io/##g' calico.yaml
cat calico.yaml |grep 'image:'

10.2将 calico.yaml 文件中定义的资源应用到 Kubernetes 集群

创建或更新 calico.yaml 文件中定义的 Kubernetes 资源,如 Deployment、Service、ConfigMap 等

(master1执行以下命令)

kubectl apply -f calico.yaml

查看安装进度

kubectl get pods -n kube-system

查看集群的Ready状态

kubectl get nodes

十一、部署master2、master3、node1、node2节点
11.1在master2和master3节点上创建证书存放目录

cd /root && mkdir -p /etc/kubernetes/pki/etcd && mkdir -p ~/.kube/

11.2在master1上传输证书等文件

cd /root && vim /root/zhengshu.sh

#!/bin/bash

masters=("master2" "master3")

for master in "${masters[@]}"; do
  scp /etc/kubernetes/pki/ca.crt ${master}:/etc/kubernetes/pki/
  scp /etc/kubernetes/pki/ca.key ${master}:/etc/kubernetes/pki/
  scp /etc/kubernetes/pki/sa.key ${master}:/etc/kubernetes/pki/
  scp /etc/kubernetes/pki/sa.pub ${master}:/etc/kubernetes/pki/
  scp /etc/kubernetes/pki/front-proxy-ca.crt ${master}:/etc/kubernetes/pki/
  scp /etc/kubernetes/pki/front-proxy-ca.key ${master}:/etc/kubernetes/pki/
  scp /etc/kubernetes/pki/etcd/ca.crt ${master}:/etc/kubernetes/pki/etcd/
  scp /etc/kubernetes/pki/etcd/ca.key ${master}:/etc/kubernetes/pki/etcd/
done

赋权

chmod +x /root/zhengshu.sh && sh /root/zhengshu.sh

11.3在master2和master3上执行刚刚保存的命令令其加入到集群中

kubeadm join 172.19.48.1:6443 --token ovwn6w.zo0w23cq6l6r6jmp \
    --discovery-token-ca-cert-hash sha256:82bdb0edf4aadff963a5f07613fe9d938a9c0fcdcfc49db0e86cc10dca0b353f \
    --control-plane

(注意,master2和master3执行完命令红框里面的命令不用再执行了)

11.4在node1和node2上执行刚刚保存的命令令其接入集群中

kubeadm join 172.19.48.1:6443 --token ovwn6w.zo0w23cq6l6r6jmp \
    --discovery-token-ca-cert-hash sha256:82bdb0edf4aadff963a5f07613fe9d938a9c0fcdcfc49db0e86cc10dca0b353f

11.5在master1上查看集群节点信息

kubectl get node

如果出现NotReady不要着急,等一会在执行一遍命令

大概五分钟左右执行命令后的。

进行到这里我们发现,etcd ,apiserver,controller-manager,scheduler都实现了高可用

kubectl get pod -n kube-system

十二,部署图像化管理界面Kubernetes Dashboard,汉化的需要自行去GitHub上寻找
12.1使用以下命令下载并应用Kubernetes Dashboard的YAML清单文件(master1节点执行)

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml

查看recommended.yaml文件需要单独下载

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml

12.2创建dashboard-admin.yaml文件

vim dashboard-admin.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard

12.3删除现有的ClusterRoleBinding

kubectl delete clusterrolebinding kubernetes-dashboard

12.4创建新的ClusterRoleBinding

kubectl create clusterrolebinding kubernetes-dashboard --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:kubernetes-dashboard

这将创建一个新的 ClusterRoleBinding,将 Kubernetes Dashboard 的 ServiceAccount 与 cluster-admin 角色绑定。

12.5部署 Kubernetes Dashboard

kubectl apply -f dashboard-admin.yaml

12.6查看Dashboard 暴露外网端口

kubectl get svc -A | grep kubernetes-dashboard

十三、访问图形化界面
13.1打开阿里云

进入ECS服务器管理界面,找到master1-安全组-开放8001端口

13.2访问图形化界面

https://弹性公网ip:端口

这里注意下,电脑自带的Edge浏览器没证书打不开,我是用的火狐,别的没试

https://47.96.97.184:30000

13.3创建账户,生成token

vim dashboard-account.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard

---

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: kubernetes-dashboard

以上主要内容是创建admin-user账户,并授予集群管理权限

13.4执行文件并获取token

kubectl apply -f dashboard-account.yaml

kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"

复制token回到图形化界面(注意:只粘贴到最后一行的You have new mail in /var/spool/mail/root之前)

eyJhbGciOiJSUzI1NiIsImtpZCI6ImJKcUpMV3R3ZVdqWVotN3lRa21RcEE4M2pBTmd6WlQwQmpOQ3dSQXd1SFEifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXRiNjR3Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI0NDYxN2ZhYy0zZWQ0LTQ0ZGItOWM1My1hZTU3MTNiMzZkMzAiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.VESlrGj_Dk3is1bWT_4D2u1FwvSAaKtmmlHekujED-b99TBMKGvi1A8DdmMNZChV_LlPmDWP2AyGiEXOCNp4HVoNkG4w3MaHFz7O3laLnGm7z2SjkTJiLihUr_1aPtA1VwRQvGpzFQyNY9kzUOYzlYQP06PkmYOXnYYPt2fdZmnAJs6ta25L-ZPoCnExil44tIyAZaCO6O6YbMF_BGDgC144CG32rV9FdJnHzF7gGnz-RDQDMIKzNqp4eb8-5Zb4T8aHtF090s1TbPflhzTr8ZeM3WyEB8BhVxFN2VsdMHe7x-iVESxP_NhVasLA24uXZ6vDZHLb4rUbylacaVwa1Q

十四、释放服务器等资源

实验完成释放掉资源,不然一直扣费(如果还需要继续学习的可以设置定时释放任务)

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐