k8s部署系列-准备工作
说明:本部署文章参照了 https://github.com/opsnull/follow-me-install-kubernetes-cluster ,欢迎给作者star
1.使用到的节点信息:
主机名 | IP地址 | 组件 |
k8s-master1 | 192.168.161.150 | etcd,kubectl,flannel |
k8s-master2 | 192.168.161.151 | etcd,kubectl,flannel |
k8s-master3 | 192.168.161.152 | etcd,kubectl,flannel |
k8s-node1 | 192.168.161.170 | kubectl,flannel |
k8s-node2 | 192.168.161.171 | kubectl,flannel |
k8s-node3 | 192.168.161.172 | kubectl,flannel |
操作系统:CentOS-7-x86_64-Minimal-1511.iso
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
2.更新系统组件和安装工具
#更新系统组件
$yum upgrade -y
#安装工具
$yum install -y net-tools vim wget ntp ntpdate epel-release conntrack ipvsadm ipset jq sysstat curl iptables libseccomp
3.设置主机名
设置每台主机的hosts
$vim /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.161.150 k8s-master1 192.168.161.151 k8s-master2 192.168.161.152 k8s-master3 192.168.161.170 k8s-node1 192.168.161.171 k8s-node2 192.168.161.172 k8s-node3
4.添加 k8s 和 docker 账户
在每台机器上添加 k8s 账户,可以无密码 sudo:
sudo useradd -m k8s
sudo sh -c 'echo 123456 | passwd k8s --stdin' # 为 k8s 账户设置密码 sudo visudo 输入 /NOPASSWD 查找到 #%wheel ALL=(ALL) NOPASSWD: ALL 然后删掉# 取消注释 sudo grep '%wheel.*NOPASSWD: ALL' /etc/sudoers 看到如下输出表示取消成功 %wheel ALL=(ALL) NOPASSWD: ALL sudo gpasswd -a k8s wheel
在每台机器上添加 docker 账户,将 k8s 账户添加到 docker 组中,同时配置 dockerd 参数:
$sudo useradd -m docker
$ sudo gpasswd -a k8s docker $ sudo mkdir -p /etc/docker/ $vim /etc/docker/daemon.json
输入以下内容并保存 { "registry-mirrors": ["https://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn"], "max-concurrent-downloads": 20 }
5.无密码 ssh 登录其它节点
本操作在k8s-master1上执行
设置 k8s-master1 可以无密码登录所有节点的 k8s 和 root 账户:
#生成密钥,一直确定就行
ssh-keygen -t rsa
#此处提示输入的密码为root账户的密码 ssh-copy-id root@k8s-master1 ssh-copy-id root@k8s-master2 ssh-copy-id root@k8s-master3 ssh-copy-id root@k8s-node1 ssh-copy-id root@k8s-node2 ssh-copy-id root@k8s-node3 #此处提示输入的密码为k8s账户的密码(123456),在创建账户的时候指定 ssh-copy-id k8s@k8s-master1 ssh-copy-id k8s@k8s-master2 ssh-copy-id k8s@k8s-master3 ssh-copy-id k8s@k8s-node1 ssh-copy-id k8s@k8s-node2 ssh-copy-id k8s@k8s-node3
测试k8s账户是否配置成功:
ssh k8s@k8s-master1 hostname && \
ssh k8s@k8s-master2 hostname && \
ssh k8s@k8s-master3 hostname && \
ssh k8s@k8s-node1 hostname && \
ssh k8s@k8s-node2 hostname && \
ssh k8s@k8s-node2 hostname
测试root账户是否配置成功:
ssh root@k8s-master1 hostname && \
ssh root@k8s-master2 hostname && \
ssh root@k8s-master3 hostname && \
ssh root@k8s-node1 hostname && \
ssh root@k8s-node2 hostname && \
ssh root@k8s-node2 hostname
如果可以无密码输出主机名则表示配置成功
6.将可执行文件路径 /opt/k8s/bin 添加到 PATH 变量中
$ sudo sh -c "echo 'PATH=/opt/k8s/bin:$PATH:$HOME/bin:$JAVA_HOME/bin' >>/root/.bashrc"
$ echo 'PATH=/opt/k8s/bin:$PATH:$HOME/bin:$JAVA_HOME/bin' >>~/.bashrc
7.关闭防火墙(本文章不用关闭,mini安装没有防火墙组件)
在每台机器上关闭防火墙:
$ sudo systemctl stop firewalld $ sudo systemctl disable firewalld $ sudo iptables -F && sudo iptables -X && sudo iptables -F -t nat && sudo iptables -X -t nat $ sudo sudo iptables -P FORWARD ACCEPT
8.关闭交换分区
如果开启了 swap 分区,kubelet 会启动失败(可以通过将参数 --fail-swap-on 设置为 false 来忽略 swap on),故需要在每台机器上关闭 swap 分区:
sudo swapoff -a 为了防止开机自动挂载 swap 分区,可以注释 /etc/fstab 中相应的条目: sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
9.关闭 SELinux
$sudo setenforce 0 $vim /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of three two values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted
10.加载内核模块
$ sudo modprobe br_netfilter
$ sudo modprobe ip_vs
11.设置系统参数
$ 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_watches=89100 fs.file-max=52706963 fs.nr_open=52706963 net.ipv6.conf.all.disable_ipv6=1 net.netfilter.nf_conntrack_max=2310720 EOF $ sudo cp kubernetes.conf /etc/sysctl.d/kubernetes.conf $ sudo sysctl -p /etc/sysctl.d/kubernetes.conf $ sudo mount -t cgroup -o cpu,cpuacct none /sys/fs/cgroup/cpu,cpuacct
- tcp_tw_recycle 和 Kubernetes 的 NAT 冲突,必须关闭 ,否则会导致服务不通;
- 关闭不使用的 IPV6 协议栈,防止触发 docker BUG;
12.设置系统时区并更新系统时间
$ # 调整系统 TimeZone $ sudo timedatectl set-timezone Asia/Shanghai $ # 将当前的 UTC 时间写入硬件时钟 $ sudo timedatectl set-local-rtc 0 $ # 重启依赖于系统时间的服务 $ sudo systemctl restart rsyslog $ sudo systemctl restart crond #更新系统时间 sudo ntpdate cn.pool.ntp.org
13.创建目录
$ sudo mkdir -p /opt/k8s/bin $ sudo chown -R k8s /opt/k8s $ sudo sudo mkdir -p /etc/kubernetes/cert $ sudo chown -R k8s /etc/kubernetes $ sudo mkdir -p /etc/etcd/cert $ sudo chown -R k8s /etc/etcd/cert $ sudo mkdir -p /var/lib/etcd && chown -R k8s /etc/etcd/cert
14.检查系统内核和模块是否适合运行 docker (仅适用于 linux 系统)
$ curl https://raw.githubusercontent.com/docker/docker/master/contrib/check-config.sh > check-config.sh $ bash ./check-config.sh
问题解决:
1.(RHEL7/CentOS7: User namespaces disabled; add 'user_namespace.enable=1' to boot command line)
grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)" reboot
14.修改和分发集群环境变量定义脚本
#!/usr/bin/bash # 生成 EncryptionConfig 所需的加密 key export ENCRYPTION_KEY=$(head -c 32 /dev/urandom | base64) # 集群各机器 IP 数组 export NODE_IPS=(192.168.161.150 192.168.161.151 192.168.161.152 192.168.161.170 192.168.161.171 192.168.161.172) # 集群各 IP 对应的 主机名数组 export NODE_NAMES=(k8s-master1 k8s-master2 k8s-master3 k8s-node1 k8s-node2 k8s-node3) # etcd 集群服务地址列表 export ETCD_ENDPOINTS="https://192.168.161.150:2379,https://192.168.161.151:2379,https://192.168.161.152:2379" # etcd 集群间通信的 IP 和端口 export ETCD_NODES="k8s-master1=https://192.168.161.150:2380,k8s-master2=https://192.168.161.151:2380,k8s-master3=https://192.168.161.152:2380" # kube-apiserver 的反向代理(kube-nginx)地址端口 export KUBE_APISERVER="https://127.0.0.1:8443" # 节点间互联网络接口名称 export IFACE="eno16777736" #VIP 所在的接口 export VIP_IF="eno16777736" #VIP地址 export MASTER_VIP="192.168.161.160" # 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 数据目录 export DOCKER_DIR="/data/k8s/docker" ## 以下参数一般不需要修改 # 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" # flanneld 网络配置前缀 export FLANNEL_ETCD_PREFIX="/kubernetes/network" # 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
15.分发集群环境变量定义脚本
source environment.sh for node_ip in ${NODE_IPS[@]} do echo ">>> ${node_ip}" scp /opt/k8s/bin/environment.sh root@${node_ip}:/opt/k8s/bin/ ssh root@${node_ip} "chmod +x /opt/k8s/bin/*" done
