K8s 集群部署



前言

学习了黑马K8s,首先跟着视频部署K8s,写下笔记

转至 原文链接
整合黑马老师笔记


一、部署k8s的两种方式:

目前生产部署Kubernetes集群主要有两种方式:

一 kubeadm

  • Kubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。

二 进制包

  • 从github下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。

本文采用kubeadm的方式搭建集群。

二、环境准备

在开始之前,部署Kubernetes 集群机器需要满足以下几个条件:

  • 一台或多台机器,操作系统CentOS7.x-86_x64
  • 硬件配置:2GB 或更多RAM,2 个CPU 或更多CPU,硬盘30GB 或更多
  • 集群中所有机器之间网络互通
  • 可以访问外网,需要拉取镜像
  • 禁止swap 分区

k8s-master:192.168.100.10
k8s-node1:192.168.100.11
k8s-node2:192.168.100.12

三、初始化准备配置

检查操作系统的版本

# 此方式下安装kubernetes集群要求Centos版本要在7.5或之上
[root@master ~]# cat /etc/redhat-release
Centos Linux 7.5.1804 (Core)

安装环境准备:下面的操作需要在所有的节点上执行。

关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

关闭selinux
selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题

sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久
setenforce 0  # 临时

禁用iptable和firewalld服务

kubernetes和docker 在运行的中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则

# 1 关闭firewalld服务
systemctl stop firewalld
systemctl disable firewalld
# 2 关闭iptables服务
systemctl stop iptables
systemctl disable iptables

关闭swap
swap分区指的是虚拟内存分区,它的作用是物理内存使用完,之后将磁盘空间虚拟成内存来使用,启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备,但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明

swapoff -a  # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab    # 永久

添加hosts

cat >> /etc/hosts << EOF
192.168.100.10 k8s-master
192.168.100.11 k8s-node1
192.168.100.12 k8s-node2
EOF

将桥接的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  # 生效

修改dns解析 否则可能无法拉取docker镜像

vi /etc/resolv.conf

#改为 :
nameserver 8.8.8.8
nameserver 114.114.114.114

时间同步
kubernetes要求集群中的节点时间必须精确一直,这里使用chronyd服务从网络同步时间
企业中建议配置内部的会见同步服务器

老师方式

# 启动chronyd服务
[root@master ~]# systemctl start chronyd
[root@master ~]# systemctl enable chronyd
[root@master ~]# date

使用老师方式无法正常同步,使用如下方式

yum install -y ntpdate
ntpdate cn.pool.ntp.org

虚拟机不管关机还是挂起,每次重新操作都需要更新时间进行同步。

四、安装 Docker、kubeadm、kubelet【所有节点】

安装docker:

wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce
systemctl enable docker && systemctl start docker

配置镜像下载加速器:

vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"]
}
systemctl restart docker
docker info     #查看docker信息,进行确认

添加阿里云软件源:

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
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

安装kubeadm、kubelet、kubectl:

 yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0
systemctl enable kubelet

五、部署k8s-master【master执行】

kubeadm init \
  --apiserver-advertise-address=192.168.100.10 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.23.0 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16 \
  --ignore-preflight-errors=all
  • apiserver-advertise-address 集群通告地址
  • image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
  • kubernetes-version K8s版本,与上面安装的一致
  • service-cidr 集群内部虚拟网络,Pod统一访问入口
  • pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一致

初始化之后,会输出一个join命令,先复制出来,node节点加入master会使用。

在这里插入图片描述
默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,可以直接使用命令快捷生成:

 kubeadm token create --print-join-command

排错:

执行kubeadmin join 提示下面失败后:

[preflight] Running pre-flight checks
	[WARNING Swap]: swap is enabled; production deployments should disable swap unless testing the NodeSwap feature gate of the kubelet
error execution phase preflight: [preflight] Some fatal errors occurred:
	[ERROR FileAvailable--etc-kubernetes-kubelet.conf]: /etc/kubernetes/kubelet.conf already exists
	[ERROR FileAvailable--etc-kubernetes-pki-ca.crt]: /etc/kubernetes/pki/ca.crt already exists
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher

先执行kubeadm reset再重新执行kubeadm join操作即可。

出现以下错误:

[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp [::1]:10248: connect: connection refused.

其他问题:

可以使用查看系统整体的最后两百行日志tail -200f /var/log/messages排查具体问题。
也可以使用dockerd查看docker启动的错误。

启动排错

六、部署容器网络 (master执行)

Calico是一个纯三层的数据中心网络方案,是目前Kubernetes主流的网络方案。

下载YAML:

https://docs.projectcalico.org/manifests/calico.yaml

下载完后还需要修改里面定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init的 --pod-network-cidr指定的一样。

修改完后文件后,进行部署:

kubectl apply -f calico.yaml
kubectl get pods -n kube-system    #执行结束要等上一会才全部running

排错:

执行后一直NotReady,查看calico状态:

[root@k8s-master01 ~]# kubectl get po -A
NAMESPACE     NAME                                       READY   STATUS                  RESTARTS         AGE
kube-system   calico-kube-controllers-64cc74d646-ddlw5   0/1     Pending                 0                16h
kube-system   calico-node-bj8h8                          0/1     Init:ImagePullBackOff   0                16h
kube-system   calico-node-csqjv                          0/1     Init:ImagePullBackOff   0                16h
kube-system   coredns-6d8c4cb4d-6j5bv                    0/1     Pending                 0                16h
kube-system   coredns-6d8c4cb4d-m6xk4                    0/1     Pending                 0                16h
kube-system   etcd-k8s-master01                          1/1     Running                 5 (15h ago)      16h
kube-system   kube-apiserver-k8s-master01                1/1     Running                 5 (15h ago)      16h
kube-system   kube-controller-manager-k8s-master01       0/1     CrashLoopBackOff        20 (2m1s ago)    16h
kube-system   kube-proxy-g62ps                           1/1     Running                 5 (15h ago)      16h
kube-system   kube-proxy-lzxdh                           1/1     Running                 1 (16h ago)      16h
kube-system   kube-proxy-sttpl                           1/1     Running                 1 (16h ago)      16h
kube-system   kube-scheduler-k8s-master01                1/1     Running                 21 (6m11s ago)   16h
。。。。。

发现calico镜像一直下载失败Init:ImagePullBackOff

尝试手动拉取,同样失败:

[root@k8s-master01 ~]# docker pull docker.io/calico/cni:v3.20.6
v3.20.6: Pulling from calico/cni
3711d8cd4959: Retrying in 1 second 
695d19431d49: Retrying in 1 second 
719a98b816cb: Retrying in 1 second 

原因:网络不通,docker.io无法访问,配置镜像源也无效。

尝试手动下载:GitHub,选择calico->tags。选择自己对应的版本,我这里是v3.25.0,就下载

下载后打开压缩包,将以下文件传输到linux服务器。
在这里插入图片描述

在文件传输的目录执行:

ctr -n k8s.io images import calico-cni.tar
ctr -n k8s.io images import calico-kube-controllers.tar
ctr -n k8s.io images import calico-node.tar

如下:

[root@k8s-master01 cni-images]# ctr -n k8s.io images import calico-cni.tar
unpacking docker.io/calico/cni:v3.25.0 (sha256:f1b231eb3436264444a430f2b1a08cfc5d25b2a333c2b2b263f4e523da22cc94)...done
您在 /var/spool/mail/root 中有新邮件
[root@k8s-master01 cni-images]# ctr -n k8s.io images import calico-kube-controllers.tar
unpacking docker.io/calico/kube-controllers:v3.25.0 (sha256:404f5c7810fcd8e968b28fa35bf92c31f821a8b11aa8a814b00189fb14123cd4)...done
[root@k8s-master01 cni-images]# ctr -n k8s.io images import calico-node.tar
unpacking docker.io/calico/node:v3.25.0 (sha256:15f06f354ca521be7f85fe081a78b70e2d5de700587ba55631551104eaf89f46)...done
您在 /var/spool/mail/root 中有新邮件

再之下安装:

kubectl apply -f calico.yaml

执行发现还是不行。

再手动将镜像导入docker:

docker load < calico-kube-controllers.tar
docker load < calico-cni.tar
docker load < calico-node.tar 

七 部署测试

部署Nginx:

创建一个nginx服务

kubectl create deployment nginx  --image=nginx:1.14-alpine

暴露端口

kubectl expose deploy nginx  --port=80 --target-port=80  --type=NodePort

在这里插入图片描述
查看服务

kubectl get pod,svc

在这里插入图片描述

完成 !

失败排查 :

在这里插入图片描述

kubectl describe pod xxxxx

服务器重启后报错 :

W1208 17:40:31.554144   12505 loader.go:221] Config not found: /root/admin.conf
The connection to the server localhost:8080 was refused - did you specify the right host or port?

Master节点出现这个报错
首先需要检查Master安装完Kubernetes后是否执行了下面命令。需要注意到是:如果整个过程都是在普通用户下使用sudo安装,则仍然需要在普通用户下执行了下面命令;如果整个过程都在root用户下安装,则还在root用户下执行了下面命令。

mkdir -p $HOME/.kube
#root用户下执行不需要加sudo
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

如果执行了,就到用户目录下检查是否有.kube文件夹,文件夹中是否有config文件,如果都有还是报错,就需要执行下面命令把它加入到环境变量中:

export KUBECONFIG=$HOME/.kube/config

Node节点出现这个报错:

kubectl命令需要使用kubernetes-admin来运行,所以需要将主节点中的/etc/kubernetes/admin.conf文件拷贝到从节点用户目录下,然后配置环境变量:

#在Master节点运行下面命令将admin.conf文件拷贝到从节点
sudo scp /etc/kubernetes/admin.conf root@192.168.63.131:~
#在Node节点运行下面命令配置环境变量
export KUBECONFIG=$HOME/admin.conf
#使生效
source /etc/profile

重启后任然报错 :

[root@slave1 ~]# kubectl get pod,svc
The connection to the server localhost:8080 was refused - did you specify the right host or port?
[root@slave1 ~]# mkdir -p $HOME/.kube
[root@slave1 ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@slave1 ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
[root@slave1 ~]# source ~/.bash_profile
[root@slave1 ~]# chown $(id -u):$(id -g) $HOME/.kube/config
[root@slave1 ~]# kubectl get pod

总结

搭建示例博客

搭建示例博客2

Dashboard部署

Logo

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

更多推荐