说明:本部署文章参照了 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

 

如果可以无密码输出主机名则表示配置成功

k8s部署系列-准备工作 随笔 第1张

 

 

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

 k8s部署系列-准备工作 随笔 第2张

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄