部署Kubernetes集群1.19.8
部署Kubernetes集群1.19.8
1.K8S环境准备(所有节点配置)
虚拟机安装须知
一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令,每台机器 2 GB 或更多的 RAM(如果少于这个数字将会影响你应用的运行内存)CPU 2 核心及以上,集群中的所有机器的网络彼此均能相互连接(公网和内网都可以),节点之中不可以有重复的主机名、MAC 地址或 product_uuid。请参见这里了解更多详细信息。
主机名 | IP | 版本 |
---|---|---|
master01 | 192.168.20.100 | kube-1.19.8 |
node01 | 192.168.20.101 | |
node02 | 192.168.20.102 | |
node03 | 192.168.20.103 |
1.1 关闭swap分区
swapoff -a && sysctl -w vm.swappiness=0
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab
#确保各个节点MAC地址或product_uuid唯一(可以不用管)
ifconfig eth0 | grep ether | awk '{print $2}'
cat /sys/class/dmi/id/product_uuid
#温馨提示:
#一般来讲,硬件设备会拥有唯一的地址,但是有些虚拟机的地址可能会重复。
#Kubernetes使用这些值来唯一确定集群中的节点。 如果这些值在每个节点上不唯一,可能会导致安装失败。
1.2 检查网络节点是否互通
简而言之,就是检查你的k8s集群各节点是否互通,可以使用ping命令来测试。
1.3 允许iptable检查桥接流量
cat <<EOF | tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
1.4 配置docker源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
#这是查看docker都要那些版本(可以不用管)
yum list docker-ce --showduplicates
1.5 安装指定的docker版本
yum -y install docker-ce-18.09.9 docker-ce-cli-18.09.9
yum -y install bash-completion
source /usr/share/bash-completion/bash_completion
1.6 配置docker优化
mkdir -pv /etc/docker && cat <<EOF | sudo tee /etc/docker/daemon.json
{
"insecure-registries": ["master01:5000"],
"registry-mirrors": ["https://tuv7rqqq.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
1.7 配置docker开机自启动
#禁用防火墙、禁用selinux
systemctl enable --now docker && systemctl status docker
systemctl disable --now firewalld
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
grep ^SELINUX= /etc/selinux/config
1.8 配置host解析
cat >> /etc/hosts <<'EOF'
192.168.20.100 master0
192.168.20.101 node01
192.168.20.102 node02
192.168.20.103 node03
EOF
cat /etc/hosts
1.9 master01节点启用docker registry的私有仓库
docker run -dp 5000:5000 --restart always --name master-registry registry:2
2.安装kubeadm,kubelet、kubectl
2.1 配置软件源(所有节点)
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
EOF
2.2 安装kubeadm,kubelet,kubectl软件包(所有节点)
yum -y install kubeadm-1.19.8 kubelet-1.19.8 kubectl-1.19.8
systemctl enable --now kubelet.service
3.初始化master
3.1 使用kubeadm初始化master节点
kubeadm init --kubernetes-version=v1.19.8 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --service-cidr=10.254.0.0/16
3.2 拷贝授权文件,用于管理K8S集群
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
3.3 查看节点
#只会显示一个 不要紧 还没有安装完
kubectl get nodes
3.4 将令牌拷贝到node节点
#所有节点执行
kubeadm join 10.0.0.201:6443 --token dz4q8s.mtidik1zy0rn8wq8 \
--discovery-token-ca-cert-hash sha256:6b0dae420423df059770775c8be493fbd2e58c62e8e31b8c5c66197f6e775ab9
===这里用于token令牌过期了可以使用这个方式==
#如果中途不小心找不到这个令牌了 就重新生成打印这是node节点的key
kubeadm token create --print-join-command
#还有一个生成master节点的key
kubeadm init phase upload-certs --upload-certs
4.初始化网络组件
选择其中一个即可:
简单对比
flannel
1.引入了多个网络组件,在网络通信时需要转到flannel0网络接口,再转到用户态的flanneld程序,到对端后还需要走这个过程的反过程,所以也会引入一些网络的时延损耗。
2.Flannel模型默认采用了UDP作为底层传输协议,UDP本身是非可靠协议,虽然两端的TCP实现了可靠传输,但在大流量、高并发的应用场景下还建议多次测试。
calico
1.节点组网时可以直接利用数据中心的网络结构(L2或者L3),不需要额外的NAT、隧道或者Overlay Network,没有额外的封包解包,能够节约CPU运算,提高网络效率。
2.在小规模集群中可以直接互联,在大规模集群中可以通过额外的BGP route reflector来完成。
3.基于iptables或ipvs还提供了丰富的网络策略,实现了Kubernetes的Network Policy策略,提供容器间网络可达性限制的功能。
争议 | Flannel vs Calico,k8s 网络方案该选谁?_51CTO博客_k8s flannel calico区别
- flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
- calico
wget https://docs.projectcalico.org/manifests/calico.yaml
#上面不好使的话用下面的
wget https://docs.projectcalico.org/v3.14/manifests/calico.yaml --no-check-certificate
#如果网络插件初始化出现假死的情况 也就是显示是运行的(runing)但是显示是0但又不影响业务 增加一条内容
#搜索/IPIP 找到key value格式字样 增加下面内容 可以指定一个网卡(我这里就指定一个网卡了)
- name: IP_AUTODETECTION_METHOD #增加内容
value: "interface=eth0" #增加内容
5.添加自动补全功能
echo "source <(kubectl completion bash)" >> ~/.bashrc && source ~/.bashrc
6.卸载重新安装
kubeadm reset -f
modprobe -r ipip
lsmod
rm -rf ~/.kube/
rm -rf /etc/kubernetes/
rm -rf /etc/systemd/system/kubelet.service.d
rm -rf /etc/systemd/system/kubelet.service
rm -rf /usr/bin/kube*
rm -rf /etc/cni
rm -rf /opt/cni
rm -rf /var/lib/etcd
rm -rf /var/etcd
yum -y remove kubeadm* kubectl* kubelet* docker*
reboot
#还需要删除docker image镜像哦