Kubeadm集群部署k8s
一:部署环境
二:部署Kubernetes
三:master节点初始化
四:Node加入master
一:部署环境
实验环境: vmware 干净的centos7

 k8s-master-0 192.168.10.124
 k8s-node-0 192.168.10.131
 k8s-node-1 192.168.10.132
 k8s-node-2 192.168.10.133
 确保yum可用
 确保hosts配置一致
 确保节点之间可以ssh免密登录

在k8s kubeadm方式安装的官方文档中就提到需要注意以下几点:
https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/


实验准备:

 *所有节点selinux关闭
 setenforce 0 临时关闭
 sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config  永久关闭
 *所有防火墙关闭
 systemctl stop firewalld && systemctl disable firewalld
 *所有节点swap关闭
  swapoff -a 临时关闭
  sed -i 's/.*swap.*/#&/' /etc/fstab 永久关闭

所有节点安装docker

 yum install -y yum-utils device-mapper-persistent-data lvm2
 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 
yum -y install docker-ce
stemctl start docker
systemctl enable docker

所有节点安装kubeadm和kubelet

[root@k8s-master-0 ~]#  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=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
eof


yum -y install kubeadm-1.19.7  kubelet-1.19.7  kubectl-1.19.7 ipvsadm

 ##需要指定版本,默认是下载最新的版本,如果版本比你使用的群集组件版本高,就会初始化失败;如果安装失败加上 --nogpgcheck 参数
 node节点不需要安装kubectl,kubectl是一个agent读取kubeconfig访问api-server来操作集群,node节点一般不需要

 

 



所有节点获取docker的cgroups

DOCKER_CGROUPS=$(docker info | grep 'Cgroup' | cut -d':' -f2)
echo $DOCKER_CGROUPS
 
所有节点配置kubelet的cgroups

 cat >/etc/sysconfig/kubelet<<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=cgroupfs --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.1"
EOF

所有节点加载内核

modprobe br_netfilter

所有节点修改内核参数

 cat >> /etc/sysctl.conf <<eof
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness=0
eof

 sysctl -p

检查内核模块是否加载成功

 lsmod | grep ip 
 

kubelet --version
 kubeadm version

 

二:部署Kubernetes
下载各个组件

K8S_VERSION=v1.19.7
ETCD_VERSION=3.4.13-0
DASHBOARD_VERSION=v1.8.3
FLANNEL_VERSION=v0.10.0-amd64
DNS_VERSION=1.7.0
PAUSE_VERSION=3.2

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:$K8S_VERSION
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:$K8S_VERSION
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:$K8S_VERSION
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:$K8S_VERSION
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:$ETCD_VERSION
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:$PAUSE_VERSION
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:$DNS_VERSION
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:$K8S_VERSION k8s.gcr.io/kube-apiserver:$K8S_VERSION
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:$K8S_VERSION k8s.gcr.io/kube-controller-manager:$K8S_VERSION
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:$K8S_VERSION k8s.gcr.io/kube-scheduler:$K8S_VERSION
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:$K8S_VERSION k8s.gcr.io/kube-proxy:$K8S_VERSION
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:$PAUSE_VERSION k8s.gcr.io/pause:$PAUSE_VERSION
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:$DNS_VERSION k8s.gcr.io/coredns:$DNS_VERSION
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:$ETCD_VERSION k8s.gcr.io/etcd:$ETCD_VERSION

也可以写成一个脚本来运行,2021年11月04日,实验失败会报错,后面只能一行行的复制执行

cat >> kubernetes.sh << eof
#!/bin/bash
K8S_VERSION=v1.19.7
ETCD_VERSION=3.4.13-0
DASHBOARD_VERSION=v1.8.3
FLANNEL_VERSION=v0.10.0-amd64
DNS_VERSION=1.7.0
PAUSE_VERSION=3.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:$K8S_VERSION
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:$K8S_VERSION
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:$K8S_VERSION
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:$K8S_VERSION
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:$ETCD_VERSION
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:$PAUSE_VERSION
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:$DNS_VERSION
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:$K8S_VERSION k8s.gcr.io/kube-apiserver:$K8S_VERSION
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:$K8S_VERSION k8s.gcr.io/kube-controller-manager:$K8S_VERSION
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:$K8S_VERSION k8s.gcr.io/kube-scheduler:$K8S_VERSION
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:$K8S_VERSION k8s.gcr.io/kube-proxy:$K8S_VERSION
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:$PAUSE_VERSION k8s.gcr.io/pause:$PAUSE_VERSION
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:$DNS_VERSION k8s.gcr.io/coredns:$DNS_VERSION
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:$ETCD_VERSION k8s.gcr.io/etcd:$ETCD_VERSION
eof

bash kubernetes.sh

invalid reference format
Error parsing reference: "registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:" is not a valid repository/tag: invalid reference format

 

启动kubelet
 

systemctl enable kubelet
systemctl start kubelet


三:master节点初始化


3.1 命令行初始化方式

 kubeadm init --kubernetes-version=v1.19.7 --pod-network-cidr=10.244.0.0/16  --service-cidr=10.96.0.0/12 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version 1.19.7


kubeadm init --kubernetes-version=v1.19.7 --pod-network-cidr=192.168.0.0/16 --service-cidr=172.10.0.0/16  --image-repository registry.aliyuncs.com/google_containers --kubernetes-version 1.19.7
    # --service-cidr:指定service网段
    # --pod-network-cidr:指定K8S POD网段,不同的网络插件默认网段不一样
    # --iamge-repository:指定国内镜像仓库地址
    # --kuberntes-version 1.19.7:指定需要的版本
    # --ignore-preflight-errors:忽略因为系统配置SWAP而产生的错误

 

#重置初始化状态

kubeadm reset

3.2配置文件初始化方式

配置文件需要添加pod网段等信息
 

kubeadm config print init-defaults > kubeadm-config.yaml


W1104 12:03:33.340082    9775 configset.go:348] WARNING: kubeadm cannot validate component configs for API groups [kubelet.config.k8s.io kubeproxy.config.k8s.io]
 

kubeadm init --config=kubeadm-config.yaml

2021.11.04, 暂时解决不了,先用命令行初始化方式的方式学习下去


复制配置文件到用户HOME目录

root用户可以直接用下面的命令

export KUBECONFIG=/etc/kubernetes/admin.conf

非root用户执行下面命令复制配置文件

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config




验证K8S集群服务状态,看到是NotReady状态,这是因为还没有配置CNI容器网络接口(Container Network Interface),CNI标准要求节点与节点网络互通、节点与容器之间网络互通、容器与容器之间网络互通。

kubectl get nodes



K8S支持多种CNI,而从1.18开始推荐使用calico而不再是flannel,Calico 是一种容器之间互通的网络方案。在虚拟化平台中,比如 OpenStack、Docker 等都需要实现 workloads 之间互连,但同时也需要对容器做隔离控制,就像在 Internet 中的服务仅开放80端口、公有云的多租户一样,提供隔离和管控机制。而在多数的虚拟化平台实现中,通常都使用二层隔离技术来实现容器的网络,这些二层的技术有一些弊端,比如需要依赖 VLAN、bridge 和隧道等技术,其中 bridge 带来了复杂性,vlan 隔离和 tunnel 隧道则消耗更多的资源并对物理环境有要求,随着网络规模的增大,整体会变得越加复杂。我们尝试把 Host 当作 Internet 中的路由器,同样使用 BGP 同步路由,并使用 iptables 来做安全访问策略,最终设计出了 Calico 方案。

(如果还需要flannel的话通过https://github.com/coreos/flannel页面下方的Deploying flannel manually可以找到一键部署的命令)。

calico网页上提供了安装方式(https://docs.projectcalico.org/getting-started/kubernetes/self-managed-onprem/onpremises)运行完成后等一会儿,然后运行docker images命令可以看到CNI的镜像

 #cacico安装方法


wget --no-check-certificate  https://docs.projectcalico.org/manifests/calico.yaml
kubectl apply -f calico.yaml
    

 

#flannel安装方法
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 

查看kube-system这个名称空间下的pods信息,K8S组件默认都在该名称空间下。验证flannel镜像是否拉取成功以及node状态是否正常,都没问题的话Master节点就安装完成了

#查看所有namespace

kubectl get ns  


 #查看指定namespace下的pods

kubectl get pods -n kube-system 


 #查看状态是否为Ready 

kubectl get node 

 

 


四:Node加入master
注意:
由于kubeadm生成的token是有过期时间的,

可以通过以下方式重新创建node节点和master节点的token
没有记录集群 join 命令的可以通过以下方式重新获取:
kubeadm token create --print-join-command --ttl=0


或者下面的方式

 

#重新生成node节点token

#查看当前环境中的token和有效时间
kubectl get secret -n kube-system  
kubectl get secret -n kube-system bootstrap-token0-5wfwud -o yaml  

#查看bootstrap token信息,其中expiration就是过期时间,用base64命令解密可以看到准确时间
echo "expiration里的字符串" | base64 --decode  #查看过期时间

 #删除过期token
kubectl delete secret -n kube-system bootstrap-token0-5wfwud

#生成新的node节点密钥
kubeadm token create --print-join-command  

#重新生成master节点token
kubeadm init phase upload-certs --upload-certs

使用kubeadm join命令将新节点加入集群,如果命令提示no route to host请查看Master的iptables规则是否清空

kubeadm join 192.168.91.128:6443 --token v0foy6.svwh862jcr2efdws     --discovery-token-ca-cert-hash sha256:c42245a312a4de167ad87fa839c0bedaf4cb7cd30a104e8e7fc0657ee1cd33f1 

在主节点使用kubectl get nodes验证状态为Ready,如果提示Not Ready的话需要等node节点的镜像都拉取完毕。显示角色为代表它可以成为其他角色。至此Node节点配置完毕

 #在master执行此命令查看详情

kubectl get pod -n kube-system -o wide

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐