k8s集群搭建

k8s_1个master_1个node_集群搭建

步骤小结

1:安装docker
2:安装kubeadm/kubectl/kubelet
3:创建master节点的集群(并安装网络插件calico)
4:添加node节点到集群
5:创建pod验证集群可用性
6:卸载当前版本k8s
7:重启master
8:重启node1

下面对于master、Node节点同时进行

1.安装docker

sudo yum update
yum install -y docker-ce #安装免费版
vim /etc/docker/daemon.json #修改docker的cgroup驱动为systemd,否则kubeadm --init的时候会报错
# 添加这段json配置:  
{"exec-opts": ["native.cgroupdriver=systemd"]}

systemctl daemon-reload   # 重载配置
systemctl restart docker #启动docker服务
systemctl enable docker.service
docker run hello-world #会自动去拉取镜像,成功运行表示docker服务启动成功

2.安装k8s

#设置主机名字,不管是master还是node节点,都需要这样设置一下,不然kubeadmin join的时候会使用默认名字,而导致冲突,进而添加失败,名字随便,只需要唯一即可
#master节点上`hostnamectl set-hostname master`
hostnamectl set-hostname master
#node节点上`执行hostnamectl set-hostname node1`
hostnamectl set-hostname node1
#修改ip映射,不然安装时无法解析hostname(两个节点上都改就行)
vim /etc/host
10.255.0.67 master
10.255.0.69 node1

#关防火墙
systemctl stop firewalld
systemctl disable firewalld
setenforce 0

#对file中每行匹配到的第一个字符串进行替换格式为:sed -i 's/原字符串/新字符串/'file
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

#配置网络,便于各pod的通信
vim /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
#刷新配置
sysctl -p /etc/sysctl.d/k8s.conf

#关交换内存
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab

#配置镜像源,直接装kubectl会报错找不到
vim /etc/yum.repos.d/kubernetes.repo #输入下面缩进的内容
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
# 刷新包管理器
yum update

#查看kubelet有哪些版本
yum --showduplicates list kubelet

#安装
yum -y install kubeadm-1.22.0 kubectl-1.22.0 kubelet-1.22.0 #此处安装指定版本-1.22.0
#yum install -y kubelet kubeadm kubectl #此处安装最新版本

下面只对于master节点进行

3.创建集群

#启动kubelet服务并查看状态,此时kubelet服务的状态应该为auto-restart,也可能为dead,init后再次手动启动即可,因为需要kubeadm --init成功,kubelet服务才能启动
systemctl start kubelet & systemctl status kubelet
#设置kubelet开机启动
systemctl enable kubelet.service

#apiserver-advertise-address表示master ip
#文档地址https://kubernetes.io/zh-cn/docs/reference/setup-tools/kubeadm/kubeadm-init/
#初始化集群,初始化成功时记得保存它自动输出的:kubeadm join xx token xxxx,后续添加节点的时候会用到
kubeadm init --apiserver-advertise-address=10.255.xx.xx --image-repository registry.aliyuncs.com/google_containers
#成功初始化后显示:
------------------------------------------------------------------------------------------------------------------------
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:
  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 10.255.xx.xx:6443 --token 3nbxco.tvtwkyxxxxxxxxxx \
        --discovery-token-ca-cert-hash sha256:8f142ba308e9bda7cab26e86ba44b1a7ca98654ab6c9xxxxxxxxxxxxxxxxxxxx 
------------------------------------------------------------------------------------------------------------------------

#--v=6 #类似于verbose; 查看集群初始化状态
systemctl start kubelet & systemctl status kubelet

#若执行上面那条命令报:[ERROR CRI]: container runtime is not running的错,则按如下操作把disabled_plugins = ["cri"] 这一行改成disabled_plugins = [],然后重启服务,然后再次执行init
#没有报错不用执行
sudo vim cat /etc/containerd/config.toml #修改配置文件
systemctl restart containerd #重启容器服务

#如果因为已经安装过一次,此时再次kubeadm --init会报错,需要执行kubeadm reset命令来重置,然后再执行init
#如果一直卡在[kubelet-check] Initial timeout of 40s passed.
#查看kubelet日志,总之就是看--init时apiserver的ip有没有搞错、docerk服务是否执行了systemctl enable docker.service
journalctl -u kubelet # 查看日志

#此时运行kubectl get nodes会报错,需要在master上先执行下列命令,此处操作是kubeadm --init成功后会提示你要把KUBECONFIG导出,然后source一下
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
chown $(id -u):$(id -g) $HOME/.kube/config

#查看节点状态,此时状态为notReady需要安装网络
kubectl get nodes

#安装calico(网络插件)
wget https://docs.projectcalico.org/manifests/calico.yaml --no-check-certificate
#不行换成这个 wget https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
#再不行手动下载传上去
kubectl apply -f calico.yaml
kubectl get pods -n kube-system #查看calico是否运行
kubectl get nodes #如果apply之后立即查可能会显示NotReady,过一会再查就是ready了

下面操作只在Node节点上进行

4.添加节点

#1:安装docker,同步骤1,略
#2:安装k8s,同步骤2
#3:启动Kubelet
systemctl start kubelet &systemctl status kubelet
#4:node1主动申请添加到集群中,10.255.xx.xx为master的IP,下面这条语句就是master机器在执行kubeadm --init时所打印的,此处复制粘贴即可,把当前节点加入到master节点的集群。
kubeadm join 10.255.xx.xx:6443 --token 3nbxco.tvtwkyxxxxxxxxxx \
        --discovery-token-ca-cert-hash sha256:8f142ba308e9bda7cab26e86ba44b1a7ca98654ab6c94xxxxxxxxxxxxxxxxxxxx 
        
#下面的操作是在master上。查看所有节点信息,马上查看可能会显示NotReady,需要等一会才会显示为Ready
kubectl get nodes

#显示下面的结果,即集群搭建成功
[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES                  AGE     VERSION
master   Ready    control-plane,master   34m     v1.22.0
node1    Ready    <none>                 2m46s   v1.22.0

5.创建一个 nginx pod来验证集群是否能正常工作,在master上执行

# 创建pod 
kubectl create -f https://k8s.io/examples/pods/pod-nginx.yaml --record
# 也可以先下载到本地,再修改部署
wget https://k8s.io/examples/pods/pod-nginx.yaml --no-check-certificate
kubectl apply -f pod-nginx.yaml --record
# 查看 pod
kubectl get pod -o wide # 查看状态是否为Running 以及IP,立马查看可能显示处于Pending状态,可能要等一会才会显示为Running,如果一直是pending,说明其他地方有问题
# 查看 pod 详情,查看问题所在
kubectl describe pod pod-name
# 如果是节点标签问题导致容器调度失败,给节点设置标签
# 列出当前集群中的节点和它们的标签:
kubectl get nodes --show-labels
# 给节点node1 添加标签 disktype=ssd
kubectl label nodes node1 disktype=ssd
# 给节点node1 删除标签 disktype=ssd
kubectl label nodes node-1 disktype-
# 重新部署
kubectl apply -f pod-nginx.yaml --record

6.卸载k8s

yum -y remove kubelet kubeadm kubectl #卸载当前版本的kube系列,因为如果master和node1如果k8s版本不同也会报错
yum -y install kubeadm-1.22.0 kubectl-1.22.0 kubelet-1.22.0 #安装指定版本

7.重启master

#master上执行
kubeadm reset #这个命令就是重启集群
systemctl restart docker #启动docker服务
systemctl enable docker.service #自启动
systemctl start kubelet & systemctl status kubelet
kubeadm init --apiserver-advertise-address=10.255.xx.xx --image-repository registry.aliyuncs.com/google_containers
#master上执行,node1不需要(凡是在node1上执行报 Config not found: /etc/kubernetes/admin.conf的错的指令都是需要在master执行的
kubectl apply -f calico.yaml
kubectl get nodes

8.重启node1。下面的命令都是在node1上执行

#改了host之后好像需要需要kubeadm reset
kubeadm reset #这个命令就是重启集群
#如果报错10250端口被占用,就用这个查看进程号
netstat -anp |grep 10250
kill -9 进程号
systemctl restart docker #启动docker服务
systemctl enable docker.service
systemctl start kubelet & systemctl status kubelet
#node1上执行,先删除两个文件,这两个文件是在执行join的时候会自动生成,如果已存在则会报错
rm /etc/kubernetes/kubelet.conf
rm /etc/kubernetes/pki/ca.crt
kubeadm join 10.255.xx.xx:6443 --token 3nbxco.tvtwkyxxxxxxxxxxx \
        --discovery-token-ca-cert-hash sha256:8f142ba308e9bda7cab26e86ba44b1a7ca98654ab6c9xxxxxxxxxxxxxxxxxxxx 
Logo

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

更多推荐