1、架构规划
在master节点和node节点之间,需要增加负载均衡器,使node节点的访问流量可以负载均衡到master节点。
- keeplive:类似F5作用,配置虚拟IP,用于检查当前节点状态;
- haproxy:类似节点niginx,负载均衡(虚拟IP会集中到其中一个master节点),可以平均分配流量到master1,master2;
haproxy与nginx的区别:nginx是master-workers多进程
,每个线程单线程,多核CPU能充分利用;haproxy是多线程
,单线程实现超高性能,虽然haproxy也能多进程,但网上多看多看进程也不能提升性能,不建议多进程跑。
2、环境准备
2.1、节点规划
角色 | 主机名 | IP | 组件 |
---|---|---|---|
master | master1 | 192.168.0.4 | keepalived,haproxy ,kube-apiserver,kube-controller-manager,kube-scheduler,etcd |
master | master2 | 192.168.0.5 | keepalived,haproxy ,etcd |
node | node1 | 192.168.0.6 | kubelet,kube-proxy,docker,flannel、etcd |
VIP | k8s-vip | 192.168.0.7 | 虚拟IP |
2.2、后置环境准备
- 设置主机名称和主机配置
hostnamectl set-hostname master1
hostnamectl set-hostname master2
hostnamectl set-hostname node1
hostnamectl set-hostname k8s-vip
#辅助命令:hostname 查看主机名称
- 全部虚拟机修改vi /etc/ hosts
cat > /etc/hosts << EOF
192.168.0.4 master01.k8s.io master1
192.168.0.5 master02.k8s.io master2
192.168.0.6 node01.k8s.io node1
192.168.0.7 master.k8s.io vip
EOF
其他配置:参考我的《基于二进制方式搭建K8s集群-前置环境准备》。
3、master节点部署keepalived
3.1、安装包准备
- 离线下载到本地安装
#下载到本地目录的/opt/keepalived
yum install --downloadonly --downloaddir=/opt/keepalived conntrack-tools
yum install --downloadonly --downloaddir=/opt/keepalived libseccomp
yum install --downloadonly --downloaddir=/opt/keepalived libtool-ltdl
yum install --downloadonly --downloaddir=/opt/keepalived keepalived
#离线安装
yum install *
- 在线安装
yum install -y conntrack-tools,libseccomp,libtool-ltdl,keepalived
3.2、配置master节点
参考资料: kubeadm 创建高可用集群,kubeadm高可用配置文件编写;
3.2.1、master1节点配置
- 配置master1 keepalived
高可用haproxy配置,网卡名称(interface)配置
#interface 网卡名:需要配置为实际的网卡名称
#virtual_ipaddress: 改为VIP的IP地址
cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id k8s
}
vrrp_script check_haproxy{
script "killall -0 haproxy"
interval 3 #每隔3秒执行一次上面的检测
weight -2 #权重减2
rise 2
fall 10
}
vrrp_instance VI_1 {
state MASTER #名称唯一
interface eth0 #通过ifconfig获取实际:网卡名称
virtual_router_id 51 #VRRP 路由ID实例,每个实例是唯一的
priority 100 #优先级,备服务器设置 90
advert_int 1 #指定VRRP 心跳包通告间隔时间,默认1秒
authentication {
auth_type PASS
auth_pass ceb1b3ec013d66163d6ab
}
# 虚拟IP(虚拟服务器节点IP)
virtual_ipaddress {
192.168.0.7
}
track_script {
chk_haproxy
}
}
EOF
3.2.2、master2节点配置
- 查看网卡名称命令(ifconfig),注意每台机器网卡名称可能不一样;
- 配置master2 keepalived
高可用haproxy配置,网卡名称(interface)配置,和master1不一样地方:`state: BACKUP,interface:eth0 ;
#interface 网卡名:需要配置为实际的网卡名称
#virtual_ipaddress: 改为VIP的IP地址
cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id k8s
}
vrrp_script check_haproxy{
script "killall -0 haproxy"
interval 3 #每隔3秒执行一次上面的检测
weight -2 #权重减2
rise 2
fall 10
}
vrrp_instance VI_1 {
state BACKUP #名称唯一
interface eth0 #通过ifconfig获取实际:网卡名称
virtual_router_id 51 #VRRP 路由ID实例,每个实例是唯一的
priority 100 #优先级,备服务器设置 90
advert_int 1 #指定VRRP 心跳包通告间隔时间,默认1秒
authentication {
auth_type PASS
auth_pass ceb1b3ec013d66163d6ab
}
# 虚拟IP(虚拟服务器节点IP)
virtual_ipaddress {
192.168.0.7
}
track_script {
chk_haproxy
}
}
EOF
3.2.3、启动和检查
在两台master节点都执行;
#启动keepalived并设置开机启动
systemctl daemon-reload && systemctl start keepalived.service && systemctl enable keepalived.service
#查看状态
systemctl status keepalived.service
启动后查看master1的网卡信息,会发现增加虚拟IP
地址 ;当master1节点挂掉,虚拟IP会飘到master2节点,从而实现高可用;
#查看网卡,命令格式:ip as master1网卡名称
ip a s eth0
#如下所示,将虚拟ip使用master1的IP,生产环境中需将虚拟IP转换为F5或nginx;
4、 haproxy
(1)社区版:https://www.haproxy.org/
(2)企业版:https://www.haproxy.com/
4.1、安装包准备
-离线下载到本地安装
#进入cd /opt/haproxy目录
yum install --downloadonly --downloaddir=/opt/haproxy haproxy
#安装
yum install *
-在线安装
yum install -y haproxy
4.2,配置
两台master节点的配置均相同,配置中声明了后端代理的两个master节点服务器,指定了haproxy运行的端口为16443,因此16443端口为集群的入口
。
#配置修改:backend kubernetes-apiserver出master1和master2的IP地址
cat > /etc/haproxy/haproxy.cfg << EOF
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
log 127.0.0.1 local2 ###[err warning info debug]
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid ###haproxy的pid存放路径,启动进程的用户必须有权限访问此文件
maxconn 4000 ###最大连接数,默认4000
user haproxy
group haproxy
daemon ###创建1个进程进入deamon模式运行。此参数要求将运行模式设置为"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 ###默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
log global ###采用全局定义的日志
option dontlognull ###不记录健康检查的日志信息
option http-server-close ###每次请求完毕后主动关闭httpclose通道
option httplog ###日志类别http日志格式
option forwardfor except 127.0.0.0/8 ###如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
option redispatch ###serverId对应的服务器挂掉后,强制定向到其他健康的服务器
timeout http-request 10s ###http请求超时
timeout queue 1m
timeout connect 10s #default 10 second timeout if a backend is not found
timeout client 30s ###客户端连接超时
timeout server 30s ###服务器连接超时
timeout http-keep-alive 10s ###http alive时间
timeout check 10s ###检查超时
maxconn 60000 ###最大连接数
retries 3 ###重试3次连接失败就认为服务不可用,也可以通过后面设置
#---------------------------------------------------------------------
# kubernetes apiserver frontend which proxys to the backends
#---------------------------------------------------------------------
frontend kubernetes-apiserver
mode tcp
bind *:16443
option tcplog
default_backend kubernetes-apiserver ###响应默认backend
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend kubernetes-apiserver
mode tcp
balance roundrobin
server master1 192.168.0.4:6443 check maxconn 2000
server master2 192.168.0.5:6443 check maxconn 2000
#---------------------------------------------------------------------
# collection haproxy statistics message
#---------------------------------------------------------------------
listen stats
bind *:1080 #监听端口
stats refresh 15s #统计页面自动刷新时间
stats uri /admin?stats #统计页面url
stats realm Haproxy\ Statistics #统计页面密码框上提示文本
stats auth admin:admin #统计页面用户名和密码设置
#stats hide-version #隐藏统计页面上HAProxy的版本信息
EOF
4.3、启动和检查
在两台master节点都执行;
#启动haproxy并设置启动
systemctl daemon-reload && systemctl start haproxy && systemctl enable haproxy
#查看状态
systemctl status haproxy
检查启动端口,会看到正在监听16443端口
:
netstat -lntup | grep haproxy
5、所有节点安装docker/kubeadm/kubelet
5.1、安装docker
(1)在线部署docker,离线部署参考
#配置
wget http://mirrors.aliyun.com/docker-ce /linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
#安装
yum -y install docker-ce-18.09.9-3.el7
#启动设置开机启动
systemctl enable docker && systemctl start docker && systemctl enable docker.service
#查看安装版本
docker --version
(2)配置镜像加速器
#添加阿里镜像仓库配置管理器
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#配置镜像加速器,官方:https://docker-cn.com
#配置驱动器:“cgroupfs”默认作为Docker cgroup驱动程序, 官方推荐的驱动程序是“systemd”.
cat > /etc/docker/daemon.json << EOF
{
"exec-opts":["native.cgroupdriver=systemd"],
"registry-mirrors": [
"http://mirrors.aliyuncs.com",
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn",
"http://hub-mirror.c.163.com"]
}
EOF
#重启docker
systemctl daemon-reload && systemctl restart docker
(3)可能错误处理
- 添加阿里镜像仓库配置管理器
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 添加阿里源有时会报错,如果报错,执行如下命令使用官方源
#异常源删除
sudo rm -f /etc/yum.repos.d/docker-ce.repo
#使用官方源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
5.2、添加阿里云镜像
在线安装时,添加阿里云镜像,下载kubeadm、kubelet
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
5.3、安装kubeadm、kubelet和kubectl
由于版本号,最好指定版本安装,这里指定1.19.8版本。
-离线下载到本地安装`
#下载到本地目录的/opt/kube
yum install --downloadonly --downloaddir=/opt/kube kubelet-1.19.8
yum install --downloadonly --downloaddir=/opt/kube kubeadm-1.19.8
yum install --downloadonly --downloaddir=/opt/kube kubectl-1.19.8
#本地安装
yum install *
#查看版本:Kubernetes v1.19.8
kubelet --version
#设置kubelet开机启动
systemctl enable kubelet
-在线安装
yum install -y kubelet-1.19.8 kubeadm-1.19.8 kubectl-1.19.8
#查看版本:Kubernetes v1.19.8
kubelet --version
#设置kubelet开机启动
systemctl enable kubelet
6、部署kubernetes master
6.1、创建kubeadm配置文件
在具有vip地址的master上操作
,这里为master1;
- 创建目录
mkdir /usr/local/kubernetes/manifests -p
#进入目录
cd /usr/local/kubernetes/manifests
- 创建kubeadm文件
cat > kubeadm-config.yaml << EOF
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.19.8
#VIP地址和端口号
controlPlaneEndpoint: master.k8s.io:16443
apiserver:
certSANs:
#master hostname
- master1
- master2
#VIP主机名(hostname)
- master.k8s.io
#VIP地址
- 192.168.0.7
#master1
- 192.168.0.4
#master2
- 92.168.0.5
- 127.0.0.1
extraArgs:
authorization-mode: Node,RBAC
timeoutForControlPlane: 4m0s
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16
serviceSubnet: 10.1.0.0/16
scheduler: {}
EOF
- 在master1节点运行,参考地址
kubeadm init --config kubeadm-config.yaml
#执行后如下图所示
查看初始化需要的镜像,可以单独拉取下载后,再执行上面命令安装:
[root@master1 manifests]# kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.19.8
k8s.gcr.io/kube-controller-manager:v1.19.8
k8s.gcr.io/kube-scheduler:v1.19.8
k8s.gcr.io/kube-proxy:v1.19.8
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns:1.7.0
- 按照安装提示配置环境变量
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
按照提示保存以下内容,后面会使用到
:
kubeadm join master.k8s.io:16443 --token kyre7y.aacix6sgcy22i17b \
--discovery-token-ca-cert-hash sha256:c1e0671fe33994f70b2716a2effc2af72f7cf22358862dcd3cbb9ac9a2927376
- 使用kubectl工具查看集群和node状态
#查看node
kubectl get nodes
kubectl get pods -n kube-system
#查看集群状态
kubectl get cs
#会发现集群pods状态为Pending(等待),因尚未安装flannel网络
kubectl get pods -n kube-system
7、所有master节点安装集群网络
- 从官方地址获取的flannel的yaml,在master1上执行;
mkdir /opt/flannel
cd /opt/flannel
#国内被挡,可能需要访问外网
wget -c https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
- 安装flannel网络
kubectl apply -f kube-flannel.yml
- 再次检查集群pods运行状态
会发现在安装网络后,集群master1变为Ready,集群pods从Pending变为Running状态。
kubectl get pods -n kube-system
8、master2节点加入集群
8.1、复制秘钥及相关文件
从master1复制秘钥及其相关文件到master2。
#在master2节点创建文件夹
mkdir -p /etc/kubernetes/pki/etcd
#从master1拷贝秘钥文件到master2
scp /etc/kubernetes/admin.conf root@192.168.0.5:/etc/kubernetes
scp /etc/kubernetes/pki/{ca.*,sa.*,front-proxy-ca.*} root@192.168.0.5:/etc/kubernetes/pki
scp /etc/kubernetes/pki/etcd/ca.* root@192.168.0.5:/etc/kubernetes/pki/etcd
8.2、master2加入集群
- 加入集群master节点
执行在master1上init后输出的jioin命令,并带上参数–control-plane表示把master控制节点加入集群;
kubeadm join master.k8s.io:16443 --token kyre7y.aacix6sgcy22i17b \
--discovery-token-ca-cert-hash sha256:c1e0671fe33994f70b2716a2effc2af72f7cf22358862dcd3cbb9ac9a2927376 --control-plane
- 按照安装提示配置环境变量
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 节点安装集群网络
参考第7小节,在master2节点安装flannel;
- 检查状态
kubectl get node
kubectl get pods --all-namespaces
9、加入kubernetes node
- 加入集群node节点
在node1上执行向集群添加新节点,执行master1在kubeadm init输出的kubeadm join命令:
kubeadm join master.k8s.io:16443 --token kyre7y.aacix6sgcy22i17b \
--discovery-token-ca-cert-hash sha256:c1e0671fe33994f70b2716a2effc2af72f7cf22358862dcd3cbb9ac9a2927376
集群网络重新安装,因为添加了新的node节点
kubectl delete -f kube-flannel.yml
kubectl apply -f kube-flannel.yml
- 检查状态
kubectl get node
kubectl get pods --all-namespaces
10、测试kubernetes集群
在kbernetes集群中创建一个pod,验证是否正常运行;
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc
11、kubernetes卸载
- K8S卸载
#重置
kubeadm reset
#删除文件
rm -rf $HOME/.kube
- Helm卸载
kubectl get -n kube-system secrets,sa,clusterrolebinding -o name|grep tiller|xargs kubectl -n kube-system deletekubectl get all -n kube-system -l app=helm -o name|xargs kubectl delete -n kube-system12