搭建多主节点k8s高可用集群(三主两从一VIP)
如果使用的是阿里云,kubectl控制端不能放在master节点,因为阿里云SLB有回环问题,也就是说SLB代理的服务器不能反向访问这个问题,但是腾讯云修复了这个问题。通过这些对等连接,每个节点上的路由器可以了解整个网络的拓扑,并决定最佳路径来路由数据包。当k8s集群中某个节点服务器发生故障时,Keepalived服务会自动将失效的节点从正常队列中剔除,并将请求调度到别的正常的节点服务器上,从而
搭建多主节点k8s高可用集群(三主两从一VIP)
一、前期环境准备
安装要求
- 集群所有机器都要操作
- 一台或多台机器,操作系统CentOS7.x-86_x64
- 硬件配置:2GB 或更多RAM,2 个CPU 或更多CPU,硬盘20GB 或更多
- 集群中所有机器之间网络互通
- 可以访问外网,需要拉取镜像
- 禁止swap 分区
服务器配置
高可用集群(三主两从一VIP) | 主机名 | ip地址 | 配置 | 需要用到的服务 | 备注 |
---|---|---|---|---|---|
主 | k8s-master1 | 172.16.12.111 | 2C/2G/20G | kubeadm,docker,keepalived,haproxy | |
主 | k8s-master2 | 172.16.12.112 | 2C/2G/20G | kubeadm,docker,keepalived,haproxy | |
主 | k8s-master3 | 172.16.12.113 | 2C/2G/20G | kubeadm,docker,keepalived,haproxy | |
从 | k8s-node1 | 172.16.12.114 | 2C/2G/20G | kubeadm,docker | |
从 | k8s-node2 | 172.16.12.115 | 2C/2G/20G | kubeadm,docker | |
VIP | k8s-vip | 172.16.12.220 | 不需要真实服务器也可 |
1、检查操作系统的版本
# 此方式下安装kubernetes集群要求Centos版本要在7.5或之上
cat /etc/redhat-release
Centos Linux 7.5.1804 (Core)
2、禁用iptable和firewalld服务
kubernetes和docker 在运行的中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则
# 关闭iptables服务
systemctl stop iptables
systemctl disable iptables
#关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
2.1 补充:
如果在云服务器之类的不能关闭防火墙,需要开启相关端口;
master节点:
规则 | 端口范围 | 作用 | 使用者 |
---|---|---|---|
TCP | 6443* | Kubernetes API serve | All |
TCP | 2379-2380 | etcd server client API | kube-apiserver, etcd |
TCP | 10250 | Kubelet API | Self, Control plane |
TCP | 10251 | kube-scheduler | Self |
TCP | 10252 | kube-controller-manager | Self |
node节点:
规则 | 端口范围 | 作用 | 使用者 |
---|---|---|---|
TCP | 10252 | Kubelet API | Self, Control plane |
TCP | 30000-32767 | NodePort Services** | All |
3、添加阿里云yum源
cat >> /etc/yum.repo/aliyun.repo << EOF
[aliyun-os]
name=aliyun-os
baseurl=https://mirrors.aliyun.com/centos/7/os/x86_64/
enabled=1
gpgcheck=0
[aliyun-epel]
name=aliyun-epel
baseurl=https://mirrors.aliyun.com/epel/7/x86_64/
enabled=1
gpgcheck=0
[aliyun-extra]
name=aliyun-extra
baseurl=https://mirrors.aliyun.com/centos/7/extras/x86_64/
enabled=1
gpgcheck=0
EOF
#清除缓存
yum clean all
#重新加载源缓存
yum makecache
4、关闭selinux
#临时关闭selinux
setenforce 0
#永久关闭selinux
sed -i 's/^SELINUX=enforcing$/SELINUX=diasbled/' /etc/selinux/config
#临时关闭所有的交换分区
swapoff -a
#永久关闭所有的交换分区
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
5、修改主机名:
#进入相关主机操作
[root@k8s-master1 ~]# hostnamectl set-hostname k8s-master1
[root@k8s-master2 ~]# hostnamectl set-hostname k8s-master2
[root@k8s-master3 ~]# hostnamectl set-hostname k8s-master3
[root@k8s-node1 ~]# hostnamectl set-hostname k8s-node1
[root@k8s-node2 ~]# hostnamectl set-hostname k8s-node2
6、修改hosts文件
cat >> /etc/hosts << EOF
172.16.12.111 k8s-master1
172.16.12.112 k8s-master2
172.16.12.113 k8s-master3
172.16.12.114 k8s-node1
172.16.12.115 k8s-node2
172.16.12.220 k8s-vip
EOF
7、时间同步
#安裝同步时间命令
yum install ntpdate -y
#同步时间
ntpdate cn.pool.ntp.org
#设置定时任务每五分钟同步一次时间
echo "*/5 * * * * root /usr/sbin/ntpdate cn.pool.ntp.org &>/dev/null" >> /etc/crontab
8、调整文件数大小
[root@k8s-master1 ~]# ulimit -SHn 65535
[root@k8s-master1 ~]# cat >> /etc/security/limits.conf << EOF
* soft nofile 655360
* hard nofile 131072
* soft nproc 65535
* hard nproc 655350
* soft memlock unlimited
* hard memlock unlimited
EOF
补充说明:
hard:严格的设定,必定不能超过这个设定的数值
soft:警告的设定,可以超过这个设定值,但是若超过则有警告信息 限制资源:
core – 限制内核文件的大小
date – 最大数据大小
fsize – 最大文件大小
memlock – 最大锁定内存地址空间
nofile – 打开文件的最大数目
rss – 最大持久设置大小
stack – 最大栈大小
cpu – 以分钟为单位的最多 CPU 时间
noproc – 进程的最大数目(系统的最大进程数)
as – 地址空间限制 maxlogins – 此用户允许登录的最大数目
9、安装配置ipvsadm
#安装所需的命令(上面已经全部安装了,可以不用管)
[root@k8s-master1 ~]# yum -y install ipvsadm ipset sysstat conntrack libseccomp
#加载ipvs相关模块
[root@k8s-master1 ~]# modprobe -- ip_vs
[root@k8s-master1 ~]# modprobe -- ip_vs_rr
[root@k8s-master1 ~]# modprobe -- ip_vs_wrr
[root@k8s-master1 ~]# modprobe -- ip_vs_sh
[root@k8s-master1 ~]# modprobe -- nf_conntrack_ipv4
[root@k8s-master1 ~]# cat > /etc/modules-load.d/ipvs.conf << EOF
ip_vs
ip_vs_lc
ip_vs_wlc
ip_vs_rr
ip_vs_wrr
ip_vs_lblc
ip_vs_lblcr
ip_vs_dh
ip_vs_sh
ip_vs_nq
ip_vs_sed
ip_vs_ftp
ip_vs_sh
nf_conntrack_ipv4
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
EOF
[root@k8s-master1 ~]# systemctl enable --now systemd-modules-load.service
10、免密登录
#生成密钥
[root@k8s-master1 ~]# ssh-keygen -t rsa -P '' -f /root/.ssh/id_rsa &> /dev/null
#循环给高可用集群进行免密设置
[root@k8s-master1 ~]# for i in k8s-master1 k8s-master2 k8s-master3 k8s-node1 k8s-node2;do sshpass -p '服务器root密码' ssh-copy-id -o StrictHostKeyChecking='no' -i .ssh/id_rsa.pub $i;done
11、安装docker
yum -y install gcc-c++ gcc
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io
yum makecache fast
#启动docker服务并设置开机自启
systemctl start enable --now docker
11-1 配置docker
docker镜像加速器,cgroup
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://t1fyrekt.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
#由于新版kubelet建议使用systemd,所以可以把docker的CgroupDriver改成systemd
#重新加载docker配置
systemctl daemon-reload
#重新启动docker服务
systemctl restart docker
12、配置相关的内核参数
将桥接的IPv4 流量传递到iptables 的链
cat <<EOF >> /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
fs.may_detach_mounts = 1
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.netfilter.nf_conntrack_max=2310720
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_conntrack_max = 65536
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_timestamps = 0
net.core.somaxconn = 16384
EOF
#让其生效
sysctl --system
13、添加kubenetes国内镜像源
# 1、由于kubernetes的镜像在国外,速度比较慢,这里切换成国内的镜像源
# 2、编辑/etc/yum.repos.d/kubernetes.repo,添加下面的配置
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgchech=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
# 3、安装kubeadm、kubelet和kubectl
[root@master ~]# yum install --setopt=obsoletes=0 kubeadm-1.21.0 kubelet-1.21.0 kubectl-1.21.0 -y
# 4、配置kubelet的cgroup
#编辑/etc/sysconfig/kubelet, 添加下面的配置
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
#查看kubeadm版本
kubeadm version
# 5、设置kubelet开机自启
[root@master ~]# systemctl enable --now kubelet
13-1 k8s命令自动补全配置
yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
#终端重新连接才能生效
二、部署keepalived+haproxy 高可用
仅需部署在三台master节点
说明:
健康检查和失败切换是keepalived的两大核心功能
健康检查是用tcp三次握手,http请求等方式对负载均衡器后面的实际的服务器进行健康状态检测;
失败切换是应用于配置了主备模式的负载均衡器,利用VRRP维持主备负载均衡器的心跳。当主负载均衡器出现问题时,由备负载均衡器承载对应的业务
HAProxy 是一款TCP/HTTP 反向代理负载均衡服务器软件,类似nginx。
当k8s集群中某个节点服务器发生故障时,Keepalived服务会自动将失效的节点从正常队列中剔除,并将请求调度到别的正常的节点服务器上,从而保证用户访问不受影响。当故障节点被修复后,Keepalived服务又会自动切换回来。
如果是公有云平台部署可以选择公用云自带的负载均衡来代替haproxy和keepalived,比如阿里云的SLB,或者腾讯云的ELB(大部分公有云不支持keepalived)。如果使用的是阿里云,kubectl控制端不能放在master节点,因为阿里云SLB有回环问题,也就是说SLB代理的服务器不能反向访问这个问题,但是腾讯云修复了这个问题。
Keepalived和HAProxy组合结构
操作步骤
1、安装
yum安装 keepalived 和 haproxy
yum -y install keepalived haproxy
2、修改haproxy配置
[root@k8s-master1 ~]#cat /etc/haproxy/haproxy.cfg
global
maxconn 2000
ulimit-n 16384
log 127.0.0.1 local0 err
stats timeout 30s
defaults
log global
mode http
option httplog
timeout connect 5000
timeout client 50000
timeout server 50000
timeout http-request 15s
timeout http-keep-alive 15s
frontend monitor-in
bind *:33305
mode http
option httplog
monitor-uri /monitor
frontend k8s-master
bind 0.0.0.0:16443
bind 127.0.0.1:16443
mode tcp
option tcplog
tcp-request inspect-delay 5s
default_backend k8s-master
backend k8s-master
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 k8s-master1 172.16.12.111:6443 check
server k8s-master2 172.16.12.112:6443 check
server k8s-master3 172.16.12.113:6443 check
3、配置keepalived
- interface #网卡名称
- mcast_src_ip #该节点的ip
- virtual_ipaddress #vip地址
k8s-master1配置
[root@k8s-master1 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
script_user root
enable_script_security
}
vrrp_script chk_apiserver {
script "/etc/keepalived/check_apiserver.sh" #健康检查脚本
interval 5
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state MASTER #高可用主1
interface eth0 #网卡名称
mcast_src_ip 172.16.12.111 #该节点 IP
virtual_router_id 51
priority 100 #设置最高级优先级
advert_int 2
authentication {
auth_type PASS
auth_pass K8SHA_KA_AUTH
}
virtual_ipaddress {
172.16.12.220 #vip地址
}
track_script {
chk_apiserver
}
}
k8s-master2配置
[root@k8s-master2 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
script_user root
enable_script_security
}
vrrp_script chk_apiserver {
script "/etc/keepalived/check_apiserver.sh"
interval 5
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP #高可用 从1
interface ens33 #网卡名称
mcast_src_ip 172.16.12.112 #该k8s-master2节点 IP
virtual_router_id 51
priority 50 #设置优先级
advert_int 2
authentication {
auth_type PASS
auth_pass K8SHA_KA_AUTH
}
virtual_ipaddress {
172.16.12.220 #vip地址
}
track_script {
chk_apiserver
}
}
k8s-master3配置
[root@k8s-master3 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
script_user root
enable_script_security
}
vrrp_script chk_apiserver {
script "/etc/keepalived/check_apiserver.sh"
interval 5
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP #高可用从2
interface ens33 #网卡名称
mcast_src_ip 172.16.12,113 #该节点 IP
virtual_router_id 51
priority 49 #设置优先级
advert_int 2
authentication {
auth_type PASS
auth_pass K8SHA_KA_AUTH
}
virtual_ipaddress {
172.16.12.220 #vip地址
}
track_script {
chk_apiserver
}
}
4、健康检测脚本
所有主节点都需要
[root@k8s-master1 ~]# cat /etc/keepalived/check_apiserver.sh
#!/bin/bash
err=0
for k in $(seq 1 3);do
check_code=$(pgrep haproxy)
if [[ $check_code == "" ]]; then
err=$(expr $err + 1)
sleep 1
continue
else
err=0
break
fi
done
if [[ $err != "0" ]]; then
echo "systemctl stop keepalived"
/usr/bin/systemctl stop keepalived
exit 1
else
exit 0
fi
#给监测脚本添加执行权限
[root@k8s-master1 ~]# chmod +x /etc/keepalived/check_apiserver.sh
5、启动
启动 keepalived 与 haproxy
#生效配置文件
[root@k8s-master1 ~]# systemctl daemon-reload
#启动并设置开机自启haproxy
[root@k8s-master1 ~]# systemctl enable --now haproxy
#启动并设置开机自启keepalived
[root@k8s-master1 ~]# systemctl enable --now keepalived
测试vip漂移
①、k8s-master1主节点查看VIP
#查看IP与vip的IP
[root@k8s-master1 ~]# hostname -I
#测试vip的16443端口是否通
[root@k8s-master1 ~]# nc -v 172.16.12.220 16443
②、手动关闭master1节点
[root@k8s-master1 ~]# systemctl stop keepalived.service
③、按照keepalived的配置优先级,到master2查看
④、启动master1节点
vip自动回到master1节点
[root@k8s-master1 ~]# systemctl start keepalived.service
三、初始化k8s
master节点初始化
1、修改配置文件
k8s-master1节点创建kubeadm-config.yaml
advertiseAddress #自己的master1节点IP
name #自己的master1节点的名称
certSANs #vip地址
controlPlaneEndpoint #vip地址
kubernetesVersion #kubernets版本
podSubnet #pod网段
serviceSubnet #service网段
[root@k8s-master1 ~]# vim kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: 7t2weq.bjbawausm0jaxury
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 172.16.12.111
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: k8s-master1
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
certSANs:
- 172.16.12.220
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 172.16.12.220:16443
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.21.0
networking:
dnsDomain: cluster.local
podSubnet: 10.0.0.0/16
serviceSubnet: 10.96.0.0/12 #pod和service不能在同一网段
scheduler: {}
2、更新配置文件
kubeadm config migrate --old-config kubeadm-config.yaml --new-config new.yaml
3、同步配置文件
将new.yaml文件复制到其他master节点
scp new.yaml 172.16.12.112:/root/
scp new.yaml 172.16.12.113:/root/
查看需要的镜像文件
kubeadm config images list --config /root/new.yaml
4、下载镜像
所有master节点操作
kubeadm config images pull --config /root/new.yaml
coredns镜像可能下载不了,可以“曲线救国”
docker pull coredns/coredns:1.8.0
docker tag coredns/coredns:1.8.0 registry.cn-hangzhou.aliyuncs.com/google_containers/coredns/coredns:v1.8.0
5、初始化master1节点
master1节点 初始化,初始化后生成对应的证书
kubeadm init --config /root/new.yaml --upload-certs
6、加入集群
Token过期后生成新的token:
kubeadm token create --print-join-command
Master需要生成–certificate-key
kubeadm init phase upload-certs --upload-certs
在其他主节点执行,加入集群
kubeadm join 172.16.12.220:16443 --token 7t2weq.bjbawausm0jaxury \
--discovery-token-ca-cert-hash sha256:c1a423c36d4e61b2aad80b1b96054a6b3383c975d37913aadc16e8ab0c221997 \
--control-plane --certificate-key 68325dbd227c04b0a711a7e03af388e113ab9cddc876b231cc3ab02d74622db6
在node节点执行,加入集群。
Node节点上主要部署公司的一些业务应用,不建议在master节点部署应用。测试环境节约资源可将pod移至master节点。
kubeadm join 172.16.12.220:16443 --token 7t2weq.bjbawausm0jaxury \
--discovery-token-ca-cert-hash sha256:c1a423c36d4e61b2aad80b1b96054a6b3383c975d37913aadc16e8ab0c221997
master1节点 配置环境变量,用于访问Kubernetes集群
cat <<EOF >> /root/.bashrc
export KUBECONFIG=/etc/kubernetes/admin.conf
EOF
#让其生效
source /root/.bashrc
在 master1节点 查看集群节点状态
kubectl get nodes
kubeadm安装方式,所有的系统组件均以容器的方式运行并且在kube-system
命名空间内,此时可以查看Pod状态:
kubectl get pods -n kube-system -o wide
发现coredns处于pending状态,是因为集群网络还未连通,无法相互访问。
Calico网络组件
(只在 master1节点 操作)【网络插件,用于连接其他节点】
补充:
calico网络插件是如何在不同的node节点之间通信,如何确保不同主机的通信
1、Calico 是一种基于 BGP 协议的容器网络插件,它使用 IP-in-IP 或 VXLAN 将容器节点连接到网络。Calico 可以在 Kubernetes 集群中提供高性能和高可靠性的容器网络,并且支持跨多个主机的容器通信。
2、Calico 通过创建一个虚拟网络层次结构,将每个节点上的容器连接到网络。每个节点上都运行了 Calico 节点代理,这个代理负责管理每个节点上的网络路由和策略。
3、当一个容器需要与另一个容器进行通信时,它会使用 Calico 的虚拟网络层次结构来查找目标容器的 IP 地址。然后,Calico 会根据 BGP 协议来选择最佳的路径来路由数据包。
4、通过 BGP 协议,Calico 可以确保容器在不同主机之间的通信。为了确保不同主机之间的通信,Calico 会在每个节点上创建一个虚拟路由器,并在每个路由器之间建立 BGP 对等连接。通过这些对等连接,每个节点上的路由器可以了解整个网络的拓扑,并决定最佳路径来路由数据包。
5、此外,Calico 还可以使用网络策略来控制容器之间的访问。通过定义网络策略,管理员可以限制容器之间的流量,并确保只有授权的容器才能相互通信。
1、拉取安装包
(安装包内包含:Calico组件、Metrics组件、Dashboard组件)
git clone https://github.com/dotbalo/k8s-ha-install.git
或者使用国内镜像下载
git clone https://kgithub.com/dotbalo/k8s-ha-install.git/
#拉取完成进入该目录
cd k8s-ha-install
#切换到manual-installation-v1.20.x分支
[root@k8s-master1 k8s-ha-install]# git checkout manual-installation-v1.20.x
2、修改配置文件
如果集群重新初始化了,里面的密钥内容也需要修改。
#进入calico目录
[root@k8s-master1 k8s-ha-install]# cd calico/
注意事项:
◎ 需要改的就只要第一行的ip
#将要修改的ip改为自己的ip,按照master节点顺序的改成自己的节点ip
[root@k8s-master1 calico]# sed -i 's#etcd_endpoints: "http://<ETCD_IP>:<ETCD_PORT>"#etcd_endpoints: "https://172.16.12.111:2379,https://172.16.12.112:2379,https://172.16.12.113:2379"#g' calico-etcd.yaml
#设置临时环境变量ETCD_CA查看ca.crt文件并转化为base64格式取消换行符
[root@k8s-master1 calico]# ETCD_CA=`cat /etc/kubernetes/pki/etcd/ca.crt | base64 | tr -d '\n'`
#设置临时环境变量ETCD_CERT查看server.crt文件并转化为base64格式取消换行符
[root@k8s-master1 calico]# ETCD_CERT=`cat /etc/kubernetes/pki/etcd/server.crt | base64 | tr -d '\n'`
#设置临时环境变量ETCD_KEY查看server.key文件并转化为base64格式取消换行符
[root@k8s-master1 calico]# ETCD_KEY=`cat /etc/kubernetes/pki/etcd/server.key | base64 | tr -d '\n'`
#更换calico-etcd.yaml文件中的# etcd-key: null、# etcd-cert: null、# etcd-ca: null为指定值,临时的环境变量这这用。
[root@k8s-master1 calico]# sed -i "s/# etcd-key: null/etcd-key: ${ETCD_KEY}/g; s/# etcd-cert: null/etcd-cert: ${ETCD_CERT}/g; s/# etcd-ca: null/etcd-ca: ${ETCD_CA}/g" calico-etcd.yaml
#更换calico-etcd.yaml文件中的etcd_ca: ""#、etcd_cert: ""、etcd_key: "" 为指定值
[root@k8s-master1 calico]# sed -i 's#etcd_ca: ""#etcd_ca: "/calico-secrets/etcd-ca"#g; s#etcd_cert: ""#etcd_cert: "/calico-secrets/etcd-cert"#g; s#etcd_key: "" #etcd_key: "/calico-secrets/etcd-key" #g' calico-etcd.yaml
#设置临时环境变量POD_SUBNET从kubernetes配置文件中查找自己的网关
[root@k8s-master1 calico]# POD_SUBNET=`cat /etc/kubernetes/manifests/kube-controller-manager.yaml | grep cluster-cidr= | awk -F= '{print $NF}'`
#注意下面的这个步骤是把calico-etcd.yaml文件里面的CALICO_IPV4POOL_CIDR下的网段改成自己的Pod网段(kubeadm-config.yaml),并打开注释,不用手动改,会用到上面的环境变量;
[root@k8s-master1 calico]# sed -i 's@# - name: CALICO_IPV4POOL_CIDR@- name: CALICO_IPV4POOL_CIDR@g; s@# value: "192.168.0.0/16"@ value: '"${POD_SUBNET}"'@g' calico-etcd.yaml
3、启动
[root@k8s-maste1 calico]# kubectl apply -f calico-etcd.yaml
4、查看容器状态
[root@k8s-master1 calico]# kubectl get pods -n kube-system -o wide
5、查看节点网络连接状态
[root@k8s-master1 calico]# kubectl get nodes
四、集群测试
Metrics部署
将Master1节点的front-proxy-ca.crt复制到所有Node节点
#复制到node1节点上
[root@k8s-master1 ~]# scp /etc/kubernetes/pki/front-proxy-ca.crt k8s-node1:/etc/kubernetes/pki/front-proxy-ca.crt
#复制到node2节点上
[root@k8s-master1 ~]# scp /etc/kubernetes/pki/front-proxy-ca.crt k8s-node2:/etc/kubernetes/pki/front-proxy-ca.crt
安装metrics server
#进入上一步拉取的k8s-ha-install/metrics-server-0.4.x-kubeadm/目录
[root@k8s-master1 ~]# cd /root/k8s-ha-install/metrics-server-0.4.x-kubeadm/
#根据该目录下的yaml文件创建容器
[root@k8s-master1 metrics-server-0.4.x-kubeadm]# kubectl apply -f comp.yaml
查看节点状态
nginx部署
编写yaml文件
vim nginx.yaml
apiVersion: v1
kind: Namespace
metadata:
name: nginx-test
labels:
name: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx-deployment1
namespace: nginx-test
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.14.0
ports:
- containerPort: 80
name: nginx
---
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx
name: nginx-deployment1
namespace: nginx-test
spec:
ports:
- port: 9000
name: nginx-service80
protocol: TCP
targetPort: 80
nodePort: 31090
selector:
app: nginx
type: NodePort
访问vip:172.16.12.220:31090
master1断电关机
查看vip到达master2
打开浏览器无痕访问vip:172.16.12.220:31090
重新开机mster1节点
查看vip回到master1节点
再次打开浏览器无痕访问vip:172.16.12.220:31090
证明vip在实际应用中成功
操作借鉴云原生-K8s-2
加自己的理解与具体实践上的修改
更多推荐
所有评论(0)