003.Kubernetes二进制部署准备
一 安全策略
1.1 策略需求
相应的充足资源的Linux服务器;
设置相应的主机名,参考命令:hostnamectl set-hostname master01 ;
Mac及UUID唯一;
若未关闭防火墙则建议放通相应端口,如下:
- Master节点
其他更多前置准备见:https://kubernetes.io/zh/docs/setup/independent/install-kubeadm/
- Worker 节点
二 主要组件
2.1 核心组件
- etcd:保存了整个集群的状态;
- apiserver:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
- controller manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
- scheduler:负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;
- kubelet:负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;
- Container runtime:负责镜像管理以及Pod和容器的真正运行(CRI);
- kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡。
2.2 非核心组件
- kube-dns:负责为整个集群提供DNS服务;
- Ingress Controller:为服务提供外网入口;
- metrics:提供资源监控;
- Dashboard:提供GUI;
- longhorn:Kubernetes的开源分布式块存储系统。
延伸1:对master节点服务组件的理解:
三 部署规划
3.1 节点规划
提示:本实验使用三节点master部署,从而实现master的高可用。
3.2 组件及版本
- Kubernetes 1.18.3
- Docker 19.03.12
- Etcd 3.3.22
- Flanneld 0.12.0
- 插件:
- Coredns
- Dashboard
- Metrics-server
- Longhorn
3.3 组件策略
kube-apiserver:
- 使用节点本地 nginx 4 层透明代理实现高可用;
- 关闭非安全端口 8080 和匿名访问;
- 在安全端口 6443 接收 https 请求;
- 严格的认证和授权策略 (x509、token、RBAC);
- 开启 bootstrap token 认证,支持 kubelet TLS bootstrapping;
- 使用 https 访问 kubelet、etcd,加密通信;
kube-controller-manager:
- 3 节点高可用;
- 关闭非安全端口,在安全端口 10259 接收 https 请求;
- 使用 kubeconfig 访问 apiserver 的安全端口;
- 自动 approve kubelet 证书签名请求 (CSR),证书过期后自动轮转;
- 各 controller 使用自己的 ServiceAccount 访问 apiserver;
kube-scheduler:
- 3 节点高可用;
- 使用 kubeconfig 访问 apiserver 的安全端口;
kubelet:
- 使用 kubeadm 动态创建 bootstrap token,而不是在 apiserver 中静态配置;
- 使用 TLS bootstrap 机制自动生成 client 和 server 证书,过期后自动轮转;
- 在 KubeletConfiguration 类型的 JSON 文件配置主要参数;
- 关闭只读端口,在安全端口 10250 接收 https 请求,对请求进行认证和授权,拒绝匿名访问和非授权访问;
- 使用 kubeconfig 访问 apiserver 的安全端口;
kube-proxy:
- 使用 kubeconfig 访问 apiserver 的安全端口;
- 在 KubeProxyConfiguration 类型的 JSON 文件配置主要参数;
- 使用 ipvs 代理模式;
集群插件:
- DNS:使用功能、性能更好的 coredns;
- Dashboard:支持登录认证;
- Metric:metrics-server,使用 https 访问 kubelet 安全端口;
- Longhorn:Kubernetes的开源分布式块存储系统。
提示:本方案后续操作若未特别说明,则表示所有操作仅需要在master01节点进行。
本方案总体参考:https://github.com/opsnull/follow-me-install-kubernetes-cluster。
四 前置准备
4.1 手动添加解析
1 [root@master01 ~]# hostnamectl set-hostname master01 #其他节点依次修改对应主机名 2 [root@master01 ~]# cat >> /etc/hosts << EOF 3 172.24.8.71 master01 4 172.24.8.72 master02 5 172.24.8.73 master03 6 172.24.8.74 worker01 7 172.24.8.75 worker02 8 172.24.8.76 worker03 9 EOF
4.2 初始化准备
[root@master01 ~]# vi k8sinit.sh
1 #!/bin/sh 2 #****************************************************************# 3 # ScriptName: k8sinit.sh 4 # Author: xhy 5 # Create Date: 2020-06-27 21:59 6 # Modify Author: xhy 7 # Modify Date: 2020-06-27 21:59 8 # Version: 9 #***************************************************************# 10 # Initialize the machine. This needs to be executed on every machine. 11 12 # Mkdir k8s directory 13 mkdir -p /opt/k8s/bin/ 14 mkdir -p /data/k8s/k8s 15 mkdir -p /data/k8s/docker 16 17 # Install docker 18 useradd -m docker 19 20 # Disable the SELinux. 21 sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config 22 23 # Turn off and disable the firewalld. 24 systemctl stop firewalld 25 systemctl disable firewalld 26 27 # Modify related kernel parameters & Disable the swap. 28 cat > /etc/sysctl.d/k8s.conf << EOF 29 net.ipv4.ip_forward = 1 30 net.bridge.bridge-nf-call-ip6tables = 1 31 net.bridge.bridge-nf-call-iptables = 1 32 net.ipv4.tcp_tw_recycle = 0 33 vm.swappiness = 0 34 vm.overcommit_memory = 1 35 vm.panic_on_oom = 0 36 net.ipv6.conf.all.disable_ipv6 = 1 37 EOF 38 sysctl -p /etc/sysctl.d/k8s.conf >&/dev/null 39 swapoff -a 40 sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab 41 modprobe br_netfilter 42 43 # Add ipvs modules 44 cat > /etc/sysconfig/modules/ipvs.modules <<EOF 45 #!/bin/bash 46 modprobe -- ip_vs 47 modprobe -- ip_vs_rr 48 modprobe -- ip_vs_wrr 49 modprobe -- ip_vs_sh 50 modprobe -- nf_conntrack_ipv4 51 modprobe -- nf_conntrack 52 EOF 53 54 chmod 755 /etc/sysconfig/modules/ipvs.modules 55 bash /etc/sysconfig/modules/ipvs.modules 56 57 # Install rpm 58 yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget gcc gcc-c++ make libnl libnl-devel libnfnetlink-devel openssl-devel 59 60 # Update kernel 61 rpm --import http://down.linuxsb.com:8888/RPM-GPG-KEY-elrepo.org 62 rpm -Uvh http://down.linuxsb.com:8888/elrepo-release-7.0-4.el7.elrepo.noarch.rpm 63 yum --disablerepo="*" --enablerepo="elrepo-kernel" install -y kernel-ml 64 sed -i 's/^GRUB_DEFAULT=.*/GRUB_DEFAULT=0/' /etc/default/grub 65 grub2-mkconfig -o /boot/grub2/grub.cfg 66 yum update -y 67 68 # ADD k8s bin to PATH 69 echo 'export PATH=/opt/k8s/bin:$PATH' >> /root/.bashrc 70 71 # Reboot the machine. 72 # reboot
脚本释义:此脚本所包含的操作及优化分解如下:
- 添加docker账户;
- 关闭SELinux;
- 关闭iptables;
- 关闭swap:
- vm.swappiness = 0
- 其他内核优化:
- vm.overcommit_memory = 1 # 不检查物理内存是否够用
- vm.panic_on_oom = 0 # 开启 OOM
- net.ipv6.conf.all.disable_ipv6 = 1 # 关闭 IPV6
- net.ipv4.ip_forward = 1 # 打开转发功能
- net.bridge.bridge-nf-call-ip6tables = 1
- net.bridge.bridge-nf-call-iptables = 1 # 桥接流量获得通过主机iptables规则
- net.ipv4.tcp_tw_recycle = 0 # 开启TCP连接中TIME-WAIT sockets的快速回收
- net.ipv6.conf.all.disable_ipv6 = 1 # 禁用整个系统所有接口的IPv6
提示:必须关闭 tcp_tw_recycle,否则和 NAT 冲突,会导致服务不通;关闭 IPV6,防止触发 docker BUG。
- 安装建议软件包;
提示:为了更好的管理和查看ipvs,可安装相应的管理工具ipvsadm,具体使用参考《002.LVS管理工具的安装与使用》。
- 加载IPVS:
pod的负载均衡是用kube-proxy来实现的,实现方式有两种,一种是默认的iptables,一种是ipvs,相对iptables,ipvs有更好的性能。且当前ipvs已经加入到了内核的主干。
- ip_vs
- ip_vs_rr
- ip_vs_wrr
- ip_vs_sh
- nf_conntrack_ipv4
- 升级内核版本。
提示:对于某些特性,可能需要升级内核,内核升级操作见《018.Linux升级内核》。4.19版及以上内核nf_conntrack_ipv4已经改为nf_conntrack。
4.3 互信配置
为了更方便远程分发文件和执行命令,本实验配置master节点到其它节点的 ssh 信任关系。
1 [root@master01 ~]# ssh-keygen -f ~/.ssh/id_rsa -N '' 2 [root@master01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@master01 3 [root@master01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@master02 4 [root@master01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@worker01 5 [root@master01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@worker02
提示:本步骤操作仅需要在master01节点操作。
4.4 环境变量
[root@master01 ~]# vi environment.sh
1 #!/bin/sh 2 #****************************************************************# 3 # ScriptName: environment.sh 4 # Author: xhy 5 # Create Date: 2020-06-27 22:19 6 # Modify Author: xhy 7 # Modify Date: 2020-06-27 22:19 8 # Version: 9 #***************************************************************# 10 11 # 生成 EncryptionConfig 所需的加密 key 12 export ENCRYPTION_KEY=$(head -c 32 /dev/urandom | base64) 13 14 # 集群 MASTER 机器 IP 数组 15 export MASTER_IPS=(172.24.8.71 172.24.8.72 172.24.8.73) 16 17 # 集群 MASTER IP 对应的主机名数组 18 export MASTER_NAMES=(master01 master02 master03) 19 20 # 集群 NODE 机器 IP 数组 21 export NODE_IPS=(172.24.8.74 172.24.8.75) 22 23 # 集群 NODE IP 对应的主机名数组 24 export NODE_NAMES=(worker01 worker02) 25 26 # 集群所有机器 IP 数组 27 export ALL_IPS=(172.24.8.71 172.24.8.72 172.24.8.73 172.24.8.74 172.24.8.75) 28 29 # 集群所有IP 对应的主机名数组 30 export ALL_NAMES=(master01 master02 master03 worker01 worker02) 31 32 # etcd 集群服务地址列表 33 export ETCD_ENDPOINTS="https://172.24.8.71:2379,https://172.24.8.72:2379,https://172.24.8.73:2379" 34 35 # etcd 集群间通信的 IP 和端口 36 export ETCD_NODES="master01=https://172.24.8.71:2380,master02=https://172.24.8.72:2380,master03=https://172.24.8.73:2380" 37 38 # kube-apiserver 的反向代理(kube-nginx)地址端口 39 export KUBE_APISERVER="https://172.24.8.100:16443" 40 41 # 节点间互联网络接口名称 42 export IFACE="eth0" 43 44 # etcd 数据目录 45 export ETCD_DATA_DIR="/data/k8s/etcd/data" 46 47 # etcd WAL 目录,建议是 SSD 磁盘分区,或者和 ETCD_DATA_DIR 不同的磁盘分区 48 export ETCD_WAL_DIR="/data/k8s/etcd/wal" 49 50 # k8s 各组件数据目录 51 export K8S_DIR="/data/k8s/k8s" 52 53 # docker 数据目录 54 export DOCKER_DIR="/data/k8s/docker" 55 56 ## 以下参数一般不需要修改 57 58 # TLS Bootstrapping 使用的 Token,可以使用命令 head -c 16 /dev/urandom | od -An -t x | tr -d ' ' 生成 59 BOOTSTRAP_TOKEN="41f7e4ba8b7be874fcff18bf5cf41a7c" 60 61 # 最好使用 当前未用的网段 来定义服务网段和 Pod 网段 62 63 # 服务网段,部署前路由不可达,部署后集群内路由可达(kube-proxy 保证) 64 SERVICE_CIDR="10.20.0.0/16" 65 66 # Pod 网段,建议 /16 段地址,部署前路由不可达,部署后集群内路由可达(flanneld 保证) 67 CLUSTER_CIDR="10.10.0.0/16" 68 69 # 服务端口范围 (NodePort Range) 70 export NODE_PORT_RANGE="1-65535" 71 72 # flanneld 网络配置前缀 73 export FLANNEL_ETCD_PREFIX="/kubernetes/network" 74 75 # kubernetes 服务 IP (一般是 SERVICE_CIDR 中第一个IP) 76 export CLUSTER_KUBERNETES_SVC_IP="10.20.0.1" 77 78 # 集群 DNS 服务 IP (从 SERVICE_CIDR 中预分配) 79 export CLUSTER_DNS_SVC_IP="10.20.0.254" 80 81 # 集群 DNS 域名(末尾不带点号) 82 export CLUSTER_DNS_DOMAIN="cluster.local" 83 84 # 将二进制目录 /opt/k8s/bin 加到 PATH 中 85 export PATH=/opt/k8s/bin:$PATH
1 [root@master01 ~]# chmod u+x *.sh 2 [root@master01 ~]# source /root/environment.sh
4.5 分发并执行环境初始化
1 [root@master01 ~]# for all_ip in ${ALL_IPS[@]} 2 do 3 echo ">>> ${all_ip}" 4 scp -rp /etc/hosts root@${all_ip}:/etc/hosts 5 scp -rp k8sinit.sh root@${all_ip}:/root/ 6 ssh root@${all_ip} "bash /root/k8sinit.sh" 7 done
提示:本步骤操作仅需要在master01节点操作。
作者:木二
出处:http://www.cnblogs.com/itzgr/
关于作者:云计算、虚拟化,Linux,多多交流!
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接!如有其他问题,可邮件(xhy@itzgr.com)咨询。