1. 概述

采用裸机部署的方式,主要组件版本如下:

组件 版本 发布时间
kubernetes 1.19.6 2020-12-18
etcd v3.4.3
crictl v1.19.0 2020-08-28
containerd v1.4.3 2020-12-01
runc v1.0.0-rc92 2020-08-06
calico
coredns
dashboard
kube-prometheus v0.7.0 2020-12-10
cni-plugins v0.9.0 2020-12-10
metrics-server v0.4.1 2020-11-18

主要配置策略:

kube-apiserver:

  • 使用节点本地 nginx 4 层透明代理实现高可用;
  • 关闭非安全端口 8080 和匿名访问;
  • 在安全端口 6443 接收 https 请求;
  • 严格的认证和授权策略 (x509、token、RBAC);
  • 开启 bootstrap token 认证,支持 kubelet TLS bootstrapping;
  • 使用 https 访问 kubelet、etcd,加密通信;

kube-controller-manager:

  • 3 节点高可用;
  • 关闭非安全端口,在安全端口 10252 接收 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 安全端口;
  • Log:loki;
  • Registry 镜像库:docker-registry、harbor;

2. 初始化系统和全局变量

命令执行

hostnamectl set-hostname master				 		##设置主机名
127.0.0.1 VM-16-16-centos VM-16-16-centos master 	##加入hosts

ssh-keygen 											##生成ssh证书
ssh-copy-id root@master 							##免密登录

yum install -y epel-release							##安装依赖包
yum install -y chrony conntrack ipvsadm ipset jq iptables curl sysstat libseccomp wget socat git

systemctl stop firewalld							##关闭防火墙
systemctl disable firewalld
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat
iptables -P FORWARD ACCEPT

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

setenforce 0										##关闭selinux
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

systemctl stop postfix && systemctl disable postfix		##关闭无用服务

3. 资源文件准备

mkdir -p /opt/k8s/{bin,work} /etc/{kubernetes,etcd}/cert ##创建文件夹 运行文件都在/opt目录下,证书文件在/etc下