如果没有特殊说明,需要在所有节点上执行初始化操作。

集群规划

本次部署采用三个节点,混合部署 etcd、master 集群和 worker 集群。
三台机器操作系统为 Centos7.6,单网卡。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
  • zhaoyixin-k8s-01:192.168.16.8
  • zhaoyixin-k8s-02:192.168.16.10
  • zhaoyixin-k8s-03:192.168.16.6

设置主机名

# 使用 zhaoyixin-k8s-01 作为当前的主机名
hostnamectl set-hostname zhaoyixin-k8s-01

在每台机器的/etc/hosts文件中添加本地DNS解析:

cat >> /etc/hosts <<EOF
192.168.16.8 zhaoyixin-k8s-01
192.168.16.10 zhaoyixin-k8s-02
192.168.16.6 zhaoyixin-k8s-03
EOF

退出并重新登录 root 账号,可以看到主机名已更改。

添加节点信任,只需在 zhaoyixin-k8s-01 节点上进行,设置 root 账户可以无密码登录所有结点:

ssh-keygen -t rsa 
ssh-copy-id root@zhaoyixin-k8s-01
ssh-copy-id root@zhaoyixin-k8s-02
ssh-copy-id root@zhaoyixin-k8s-03

安装依赖包

更新 PATH 变量

echo 'PATH=/opt/k8s/bin:$PATH' >>/root/.bashrc
source /root/.bashrc

/opt/k8s/bin 目录用来保存下载安装的程序。

yum install -y epel-release
yum install -y chrony conntrack ipvsadm ipset jq iptables curl sysstat libseccomp wget socat git
  • kube-proxy 采用 ipvs 模式,ipvsadm 为 ipvs 的管理工具;
  • etcd 集群各机器需要时间同步,chrony 用于系统时间同步;

关闭部分服务

systemctl stop postfix && systemctl disable postfix

关闭防火墙,清理防火墙规则,设置默认转发策略:

systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat
iptables -P FORWARD ACCEPT

关闭 swap 分区,否则kubelet 会启动失败(可以设置 kubelet 启动参数 --fail-swap-on 为false 关闭 swap 检查):

swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab 

关闭 SELinux,否则 kubelet 挂载目录时可能报错 Permission denied

setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

优化内核参数

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
net.ipv4.neigh.default.gc_thresh1=1024
net.ipv4.neigh.default.gc_thresh1=2048
net.ipv4.neigh.default.gc_thresh1=4096
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
cp kubernetes.conf  /etc/sysctl.d/kubernetes.conf
sysctl -p /etc/sysctl.d/kubernetes.conf

关闭 tcp_tw_recycle,否则与 NAT 冲突,可能导致服务不通;

设置时钟同步

设置系统时区

timedatectl set-timezone Asia/Shanghai

设置系统时钟同步

systemctl enable chronyd
systemctl start chronyd

查看同步状态

timedatectl status

# 输出
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
  • System clock synchronized: yes,表示时钟已同步;
  • NTP service: active,表示开启了时钟同步服务。

将当前的 UTC 时间写入硬件时钟,并重启依赖系统时间的服务

timedatectl set-local-rtc 0

systemctl restart rsyslog 
systemctl restart crond

分发集群配置参数脚本

创建目录

mkdir -p /opt/k8s/{bin,work} /etc/{kubernetes,etcd}/cert

后续使用的环境变量都定义在文件 environment.sh 中(可以在文章最后查看文件内容),请根据自己的机器、网络情况修改。然后拷贝到所有节点:

source environment.sh  # 先修改脚本文件
for node_ip in ${NODE_IPS[@]}
  do
    echo ">>> ${node_ip}"
    scp environment.sh root@${node_ip}:/opt/k8s/bin/
    ssh root@${node_ip} "chmod +x /opt/k8s/bin/*"
  done

升级内核

CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的 Docker、Kubernetes 不稳定,现在将内核升级到 4.4.X 以上。

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 0

重启机器:

sync
reboot
uname -r # 查看内核是否升级成功

参考

opsnull/follow-me-install-kubernetes-cluster

环境变量文件

environment.sh

#!/usr/bin/bash

# 生成 EncryptionConfig 所需的加密 key
export ENCRYPTION_KEY=$(head -c 32 /dev/urandom | base64)

# 集群各机器 IP 数组
export NODE_IPS=(192.168.16.8 192.168.16.10 192.168.16.6)

# 集群各 IP 对应的主机名数组
export NODE_NAMES=(zhaoyixin-k8s-01 zhaoyixin-k8s-02 zhaoyixin-k8s-03)

# etcd 集群服务地址列表
export ETCD_ENDPOINTS="https://192.168.16.8:2379,https://192.168.16.10:2379,https://192.168.16.6:2379"

# etcd 集群间通信的 IP 和端口
export ETCD_NODES="zhaoyixin-k8s-01=https://192.168.16.8:2380,zhaoyixin-k8s-02=https://192.168.16.10:2380,zhaoyixin-k8s-03=https://192.168.16.6:2380"

# kube-apiserver 的反向代理(kube-nginx)地址端口
export KUBE_APISERVER="https://127.0.0.1:8443"

# 节点间互联网络接口名称
export IFACE="eth0"

# etcd 数据目录
export ETCD_DATA_DIR="/data/k8s/etcd/data"

# etcd WAL 目录,建议是 SSD 磁盘分区,或者和 ETCD_DATA_DIR 不同的磁盘分区
export ETCD_WAL_DIR="/data/k8s/etcd/wal"

# k8s 各组件数据目录
export K8S_DIR="/data/k8s/k8s"

## DOCKER_DIR 和 CONTAINERD_DIR 二选一
# docker 数据目录
export DOCKER_DIR="/data/k8s/docker"

# containerd 数据目录
export CONTAINERD_DIR="/data/k8s/containerd"

## 以下参数一般不需要修改

# TLS Bootstrapping 使用的 Token,可以使用命令 head -c 16 /dev/urandom | od -An -t x | tr -d ' ' 生成
BOOTSTRAP_TOKEN="41f7e4ba8b7be874fcff18bf5cf41a7c"

# 最好使用 当前未用的网段 来定义服务网段和 Pod 网段

# 服务网段,部署前路由不可达,部署后集群内路由可达(kube-proxy 保证)
SERVICE_CIDR="10.254.0.0/16"

# Pod 网段,建议 /16 段地址,部署前路由不可达,部署后集群内路由可达(flanneld 保证)
CLUSTER_CIDR="172.30.0.0/16"

# 服务端口范围 (NodePort Range)
export NODE_PORT_RANGE="30000-32767"

# kubernetes 服务 IP (一般是 SERVICE_CIDR 中第一个IP)
export CLUSTER_KUBERNETES_SVC_IP="10.254.0.1"

# 集群 DNS 服务 IP (从 SERVICE_CIDR 中预分配)
export CLUSTER_DNS_SVC_IP="10.254.0.2"

# 集群 DNS 域名(末尾不带点号)
export CLUSTER_DNS_DOMAIN="cluster.local"

# 将二进制目录 /opt/k8s/bin 加到 PATH 中
export PATH=/opt/k8s/bin:$PATH
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄