命令记不住

登陆

k8s 高可用 HAproxy 容器化快速部署

k8s高可用HAproxy容器化快速部署

1.基础环境配置

1.设置系统主机名以及 Host 文件的相互解析

[root@master3 /root] master3 
#cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.83.101 master1
192.168.83.102 master2
192.168.83.103 master3
192.168.83.104 node1
192.168.83.105 node2

2.安装软件依赖

[root@master3 /root] master3 
#yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim git 

3.关闭安全

[root@master1 /root] master1 
#systemctl stop firewalld && systemctl disable firewalld
#yum -y install iptables-services && systemctl start iptables && systemctl enable iptables  && iptables -F && service iptables save
[root@master3 /root] master3 
#swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

[root@master3 /root] master3 
#setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

4.调整内核参数,k8s相关

cat > kubernetes.conf << EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
[root@master1 /root] master1 
#cp kubernetes.conf /etc/sysctl.d/kubernetes.conf

[root@master1 /root] master1 
#sysctl -p /etc/sysctl.d/kubernetes.conf

5.系统服务调整

[root@master1 /root] master1 
#timedatectl set-timezone Asia/Shanghai
#timedatectl set-local-rtc 0 将当前的 UTC 时间写入硬件时钟
#systemctl restart rsyslog 
#systemctl restart crond
#systemctl stop postfix && systemctl disable postfix
#mkdir /var/log/journal # 持久化保存日志的目录 
#mkdir /etc/systemd/journald.conf.d 
#cat > /etc/systemd/journald.conf.d/99-prophet.conf << EOF
[Journal] # 持久化保存到磁盘 
Storage=persistent # 压缩历史日志 
Compress=yes 
SyncIntervalSec=5m 
RateLimitInterval=30s 
RateLimitBurst=1000 # 最大占用空间 10G 
SystemMaxUse=10G # 单日志文件最大 200M 
SystemMaxFileSize=200M # 日志保存时间 2 周 
MaxRetentionSec=2week # 不将日志转发到 
syslog ForwardToSyslog=no 
EOF
#systemctl restart systemd-journald

6.可选升级内核

rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm 
# 安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry 中是否包含 initrd16 配置,如果没有,再安装 一次! 
yum --enablerepo=elrepo-kernel install -y kernel-lt 
# 设置开机从新内核启动 
grub2-set-default "CentOS Linux (4.4.182-1.el7.elrepo.x86_64) 7 (Core)" 
# 重启后安装内核源文件 
yum --enablerepo=elrepo-kernel install kernel-lt-devel-$(uname -r) kernel-lt-headers-$(uname -r)

7.可选关闭 NUMA

cp /etc/default/grub{,.bak} vim /etc/default/grub 
# 在 GRUB_CMDLINE_LINUX 一行添加 `numa=off` 参数,如下所示: 
diff /etc/default/grub.bak /etc/default/grub
6c6 
< GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rhgb quiet" 
--- 
> GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rhgb quiet numa=off" 
cp /boot/grub2/grub.cfg{,.bak} 
grub2-mkconfig -o /boot/grub2/grub.cfg

2.安装k8s服务软件

1.ipvs配置

#modprobe br_netfilter 
#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
EOF
#chmod 755 /etc/sysconfig/modules/ipvs.modules && bash  /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

2.安装docker

**确认docker适配,1.15建议docker18.09 **
#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 list docker-ce --showduplicates | sort -r #查看docker版本
#yum update -y && yum install -y docker-ce
#mkdir /etc/docker
#cat > /etc/docker/daemon.json <<EOF
{ 
"exec-opts": ["native.cgroupdriver=systemd"], 
"log-driver": "json-file", 
"log-opts": { 
"max-size": "100m" 
} 
}
EOF
#mkdir -p /etc/systemd/system/docker.service.d
#systemctl daemon-reload && systemctl restart docker && systemctl enable docker

3.在主节点启动Haproxy 与 Keepalived 容器

#mkdir /usr/local/kuberbetes
#cd !$
[root@master1 /usr/local/kuberbetes] master1 
#ls -alh
-rw-r--r--   1 root root  71M Aug  5  2019 haproxy.tar
-rw-r--r--   1 root root  16M Aug  5  2019 keepalived.tar
-rw-r--r--   1 root root 231M Aug  5  2019 kubeadm-basic.images.tar.gz
-rwxr-xr-x   1 root root  201 Jun 21  2019 load-images.sh
-rw-r--r--   1 root root 1.5K Aug  5  2019 start.keep.tar.gz
#tar xf kubeadm-basic.images.tar.gz 
#ls -alh  kubeadm-basic.images
-rw------- 1 root root 199M Aug  5  2019 apiserver.tar
-rw------- 1 root root  39M Aug  5  2019 coredns.tar
-rw------- 1 root root 247M Aug  5  2019 etcd.tar
-rw------- 1 root root 153M Aug  5  2019 kubec-con-man.tar
-rw------- 1 root root 737K Aug  5  2019 pause.tar
-rw------- 1 root root  81M Aug  5  2019 proxy.tar
-rw------- 1 root root  79M Aug  5  2019 scheduler.tar
# 修改脚本导入镜像
#docker images
REPOSITORY                           TAG       IMAGE ID       CREATED       SIZE
k8s.gcr.io/kube-controller-manager   v1.15.1   d75082f1d121   2 years ago   159MB
k8s.gcr.io/kube-proxy                v1.15.1   89a062da739d   2 years ago   82.4MB
k8s.gcr.io/kube-scheduler            v1.15.1   b0b3c4c404da   2 years ago   81.1MB
k8s.gcr.io/kube-apiserver            v1.15.1   68c3eb07bfc3   2 years ago   207MB
k8s.gcr.io/coredns                   1.3.1     eb516548c180   2 years ago   40.3MB
k8s.gcr.io/etcd                      3.3.10    2c4adeb21b4f   2 years ago   258MB
wise2c/keepalived-k8s                latest    0ba6a7862982   3 years ago   14MB
wise2c/haproxy-k8s                   latest    fde31577093d   3 years ago   71.1MB
k8s.gcr.io/pause                     3.1       da86e6ba6ca1   3 years ago   742kB
#tar xf start.keep.tar.gz
#mv /usr/local/kuberbetes/data  /
#[root@master1 /data/lb] master1 
#tail  /data/lb/etc/haproxy.cfg 
backend be_k8s_6443
mode tcp
timeout queue 1h
timeout server 1h
timeout connect 1h
log global
balance roundrobin
server rancher01 192.168.83.101:6443
server rancher02 192.168.83.102:6443
server rancher02 192.168.83.103:6443
# 第一次启动haproxy.cfg文件先只留下一个server
[root@master1 /data/lb] master1 
#cat /data/lb/start-haproxy.sh 
#!/bin/bash
MasterIP1=192.168.83.101
MasterIP2=192.168.83.102
MasterIP3=192.168.83.103
MasterPort=6443

docker run -d --restart=always --name HAProxy-K8S -p 6444:6444 \
  -e MasterIP1=$MasterIP1 \
  -e MasterIP2=$MasterIP2 \
  -e MasterIP3=$MasterIP3 \
  -e MasterPort=$MasterPort \
  -v /data/lb/etc/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg \
  wise2c/haproxy-k8s
#cat /data/lb/start-keepalived.sh 
#!/bin/bash
VIRTUAL_IP=192.168.83.100
INTERFACE=ens33
NETMASK_BIT=24
CHECK_PORT=6444
RID=10
VRID=160
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
#修改VIP和网卡名称
[root@master1 /data/lb] master1 
#ip a
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:0e:5f:da brd ff:ff:ff:ff:ff:ff
inet 192.168.83.101/24 brd 192.168.83.255 scope global ens33
 valid_lft forever preferred_lft forever
inet 192.168.83.100/24 scope global secondary ens33
#确认已添加VIP
#netstat -tunlp | grep 6444

4.安装Kubeadm(主从配置)

#cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=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
EOF
#yum -y install kubeadm-1.15.1 kubectl-1.15.1 kubelet-1.15.1
#systemctl enable kubelet.service && systemctl start kubelet.service

5.初始化主节点

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

修改kubeadm-config.yaml

advertiseAddress: 192.168.83.101  #修改master的地址

clusterName: kubernetes
controlPlaneEndpoint: "192.168.83.100:6444"  #添加VIP
controllerManager: {}
kubernetesVersion: v1.15.1
#kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs | tee kubeadm-init.log

6.初始化集群遇到问题

#kubeadm reset
#iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
其他参考
#ifconfig cni0 down
#ip link delete cni0
#ifconfig flannel.1 down
#ip link delete flannel.1
#rm -rf /var/lib/cni/

7.加入主节点及其余工作节点

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of the control-plane node running the following command on each as root:

kubeadm join 192.168.122.80:6444 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:1ad02d18fc7256b9f5d5b58ae9e023113b51d7fdb0b14401cafe98a22ae89303 \
--control-plane --certificate-key 17c904507248e347d6f8b232008c7f5c6a3c972cb955ff33b37753b6349efc85

Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use 
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.122.80:6444 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:1ad02d18fc7256b9f5d5b58ae9e023113b51d7fdb0b14401cafe98a22ae89303 

# 注意
同样start容器haproxy和keepalived,配置信息仍用第一个。
按照初始化提示命令安装

8.部署网络

kubectl apply -f kube-flannel.yaml
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml

3.调整master高可用

1.haproxy重启

添加剩余server,然后start容器

添加rancher

[root@k8s-master1 /data/lb/etc] k8s-master1 
#cat haproxy.cfg 
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
maxconn 4096
#chroot /usr/share/haproxy
#user haproxy
#group haproxy
daemon

defaults
 log     global
 mode    http
 option  httplog
 option  dontlognull
 retries 3
 option redispatch
 timeout connect  5000
 timeout client  50000
 timeout server  50000

frontend stats-front
bind *:8081
mode http
default_backend stats-back

frontend fe_k8s_6444
bind *:6444
mode tcp
timeout client 1h
log global
option tcplog
default_backend be_k8s_6443
acl is_websocket hdr(Upgrade) -i WebSocket
acl is_websocket hdr_beg(Host) -i ws

backend stats-back
mode http
balance roundrobin
stats uri /haproxy/stats
stats auth pxcstats:secret

backend be_k8s_6443
mode tcp
timeout queue 1h
timeout server 1h
timeout connect 1h
log global
balance roundrobin
server rancher01 192.168.122.81:6443
server rancher02 192.168.122.82:6443
server rancher03 192.168.122.83:6443

重拉HA容器

#docker ps | grep HAProxy-K8S
06cd27740576        wise2c/haproxy-k8s      "/docker-entrypoint.…"   11 minutes ago      Up 11 minutes       0.0.0.0:6444->6444/tcp   HAProxy-K8S
#docker rm -f HAProxy-K8S && bash /data/lb/start-haproxy.sh

2.调整kube

APIServer中的VIP调整为本节点ip

#vim /root/.kube/config 
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: 
    server: https://192.168.122.81:6444  #每个master调整为本节点ip,不通过vip
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin

4.验证

Etcd 集群状态查看

kubectl -n kube-system exec etcd-k8s-master01 -- etcdctl \
--endpoints=https://192.168.92.10:2379 \
--ca-file=/etc/kubernetes/pki/etcd/ca.crt \
--cert-file=/etc/kubernetes/pki/etcd/server.crt \
--key-file=/etc/kubernetes/pki/etcd/server.key cluster-health
kubectl get endpoints kube-controller-manager --namespace=kube-system -o yaml
kubectl get endpoints kube-scheduler --namespace=kube-system -o yaml

.

推荐阅读