目前生产部署 Kubernetes 集群主要有两种方式:
(1)kubeadm (推荐)
Kubeadm 是一个 K8s 部署工具,提供 kubeadm init 和 kubeadm join,用于快速部署 Kubernetes 集群。官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
(2)二进制包
从 github 下载发行版的二进制包,手动部署每个组件,组成 Kubernetes 集群。Kubeadm 降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署 Kubernetes 集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。
(3)Minikube
Minikube 是一个易于在本地运行 Kubernetes 的工具,可在你的笔记本电脑上的虚拟机内轻松创建单机版 Kubernetes 集群。便于尝试 Kubernetes 或使用 Kubernetes 日常开发。
安装前准备
主机规划(centos7 2GB 或更多 RAM,2 个 CPU 或更多 CPU,硬盘 30GB 或更多)
组件说明
kube-apiserver
- 使用节点本地Nginx 4层透明代理实现高可用 (也可以使用haproxy,只是起到代理apiserver的作用)
- 关闭非安全端口8080和匿名访问
- 使用安全端口6443接受https请求
- 严格的认知和授权策略 (x509、token、rbac)
- 开启bootstrap token认证,支持kubelet TLS bootstrapping;
- 使用https访问kubelet、etcd
kube-controller-manager
- 3节点高可用 (在k8s中,有些组件需要选举,所以使用奇数为集群高可用方案)
- 关闭非安全端口,使用10252接受https请求
- 使用kubeconfig访问apiserver的安全扣
- 使用approve kubelet证书签名请求(CSR),证书过期后自动轮转
- 各controller使用自己的ServiceAccount访问apiserver
kube-scheduler
- 3节点高可用;
- 使用kubeconfig访问apiserver安全端口
kubelet
- 使用kubeadm动态创建bootstrap token
- 使用TLS bootstrap机制自动生成client和server证书,过期后自动轮转
- 在kubeletConfiguration类型的JSON文件配置主要参数
- 关闭只读端口,在安全端口10250接受https请求,对请求进行认真和授权,拒绝匿名访问和非授权访问
- 使用kubeconfig访问apiserver的安全端口
kube-proxy
- 使用kubeconfig访问apiserver的安全端口
- 在KubeProxyConfiguration类型JSON文件配置为主要参数
- 使用ipvs代理模式
集群插件
- DNS 使用功能、性能更好的coredns
- 网络 使用Flanneld 作为集群网络插件
系统初始化
1.关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
2 关闭 selinux:
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat&& iptables -P FORWARD ACCEPT
# 临时 && 永久
setenforce 0 && sed -i 's/enforcing/disabled/' /etc/selinux/config
3 关闭 swap:(k8s不建议使用交换分区,影响性能,如果开启了swap分区,kubelet会启动失败(可以通过设置参数——-fail-swap-on设置为false))
# 临时 && 永久
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
4 设置主机名:
hostnamectl set-hostname <hostname>
5添加主机解析 (如果有DNS解析可以不能配置)
cat >> /etc/hosts << EOF
192.168.44.131 k8s.harbor
192.168.44.130 k8s.master.com
192.168.44.132 k8s.node1.com
192.168.44.133 k8s.node2.com
EOF
6 将桥接的 IPv4 流量传递到 iptables 的链:
#cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system # 生效
7 时间同步(集群需要保证时间一致):
#将当前的 UTC 时间写入硬件时钟
timedatectl set-timezone Asia/Shanghai && timedatectl set-local-rtc 0
#重启依赖于系统时间的服务
systemctl restart rsyslog && systemctl restart crond
# 同步时间
yum install ntpdate -y && ntpdate cn.pool.ntp.org
8 设置免密登录(跨服务器操作方便,用于同一下发资源文件)
yum install -y expect
#分发公钥 我这里密码是123456 大家按照自己主机的密码进行修改就可以
ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa
for i in k8s.harbor k8s.master.com k8s.node1.com k8s.node2.com;do
expect -c "
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@$i
expect {
\"*yes/no*\" {send \"yes\r\"; exp_continue}
\"*password*\" {send \"123456\r\"; exp_continue}
\"*Password*\" {send \"123456\r\";}
} "
done
安装依赖
um install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
升级内核
1.Docker overlay2需要使用kernel 4.x版本,所以我们需要升级内核
2.CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的 Docker、Kubernetes 不稳定,例如: rpm -Uvh
http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
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.189-1.el7.elrepo.x86_64) 7 (Core)'
修改内核启动顺序,默认启动的顺序应该为1,升级以后内核是往前面插入,为0(如果每次启动时需要手动选择哪个内核,该步骤可以省略)
grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg
使用下面命令看看确认下是否启动默认内核指向上面安装的内核
grubby --default-kernel
#这里的输出结果应该为我们升级后的内核信息
重启加载新内核 (升级完内核顺便update一下)
reboot