前言:第一次学习k8s,网上资料讲的不是很全面,自己踩了很多的坑,记录在这里,供大家参考  

tips:在克隆虚拟机的时候,可以晚一点克隆,前面的操作相差不大,记得每一次完成较大操作后,保存快照。

一、环境介绍

环境如下:

  • 虚拟机:VMware Pro 16
  • 操作系统:CentOS7.x-86_x64
  • 集群设置:1 master,2 node
  • 硬件配置:2GB,2个CPU,硬盘20GB以上
  • 网络配置:均为NAT
    • master节点IP:192.168.30.100
    • node1节点IP:192.168.30.101
    • node2节点IP:192.168.30.102

二.网络配置及其它配置

1.关闭防火墙并禁用自启

# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

2.关闭selinux

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

3.关闭swap,关闭完swap后,一定要重启一下虚拟机!!!

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

设置主机名

hostnamectl set-hostname <hostname>

在节点中的 /etc/hosts 中添加如下内容

#需要更改为实际的ip
192.168.30.100  master
192.168.30.101  node1
192.168.30.102  node2

完成之后,可以通过ping 节点名称的方式进行访问

ip这里最好配置为静态ip

通过如下命令

vim /etc/sysconfig/network-scripts/ifcfg-ens33

上图为实际需要修改的位置,这里就不做赘述,ip需要和nat的配置在同一个网段,这部分配置可以参考这个文章:Linux环境搭建 - 飞书云文档

4. 将桥接的IPv4流量传递到iptables的链并使其生效

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

三.docker 安装

3.1如果有旧版docker,则先卸载:

yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine \
    docker-selinux 

3.2 配置Docker的yum库

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

安装成功后,执行命令,配置Docker的yum源

sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

更新yum,建立缓存

sudo yum makecache fast

3.3 安装Docker

yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

3.4 启动和校验

# 启动Docker
systemctl start docker

# 停止Docker
systemctl stop docker

# 重启
systemctl restart docker

# 设置开机自启
systemctl enable docker

# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps

3.5 可能出现的问题

如果出现

Cannot find a valid baseurl for repo: base/7/x86_64

可以参考这篇文章已解决:Cannot find a valid baseurl for repo: base/7/x86_64-CSDN博客

如果镜像源用不了,这里可以在网上找其它镜像源,然后对yum源进行更新

sudo yum clean all
sudo yum makecache

附:近期docker源

进入 /etc/docker/daemon.josn目录,添加如下内容

{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.imgdb.de",
"https://docker-0.unsee.tech",
"https://docker.hlmirror.com",
"https://docker.1ms.run",
"https://func.ink",
"https://lispy.org",
"https://docker.xiaogenban1993.com"
]
}

将docker 的 cgroupfs driver 更换成 systemd 于k8s配套

# 配置关闭 Docker 的 cgroups,修改 /etc/docker/daemon.json,加入以下内容
"exec-opts": ["native.cgroupdriver=systemd"]

然后执行重启docker

sudo systemctl daemon-reload
sudo systemctl restart docker

四.k8s安装

4.1.添加yum软件源

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
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF

4.2.安装kubeadm、kubelet和kubectl

  • kubeadm : 用于集群管理
  • kubelet: 采集节点数据汇报给 master 用
  • kubectl: 管理集群资源对象环境用

        由于版本更新频繁,此处指定版本安装;并且由于依赖关系,这些安装命令最好还是一条一条的执行。这里采用1.19.0的版本,如果有旧版本会发生冲突,

yum install -y kubectl-1.19.0
yum install -y kubelet-1.19.0
yum install -y kubeadm-1.19.0

启动k8s服务

systemctl enable kubelet

查看k8s服务是否正常启动成功

systemctl status kubelet

4.3 在master节点上部署kebenetes

kubeadm init --kubernetes-version=1.19.0 --apiserver-advertise-address=master节点的ip --image-repository registry.aliyuncs.com/google_containers --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 

成功之后,会有这部分信息

上面是需要在master节点执行的命令,按顺序执行接口

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

下面是node节点加入master节点的命令,分别在node1和node2执行

# 下方命令可以在 k8s master 控制台初始化成功后复制 join 命令

kubeadm join 192.168.30.100:6443 --token w34ha2.66if2c8nwmeat9o7 --discovery-token-ca-cert-hash sha256:20e2227554f8883811c01edd850f0cf2f396589d32b57b9984de3353a7389477


# 如果初始化的 token 不小心清空了,可以通过如下命令获取或者重新申请
# 如果 token 已经过期,就重新申请
kubeadm token create

# token 没有过期可以通过如下命令获取
kubeadm token list

# 获取 --discovery-token-ca-cert-hash 值,得到值后需要在前面拼接上 sha256:
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'

下面的操作,如果clear之后找不到认证相关信息,按序执行即可

五.部署 CNI 网络插件

在master节点上通过如下命令下载 calico 配置文件,可能会网络超时,网页重定向的话,拉取重定向链接

curl https://docs.projectcalico.org/manifests/calico.yaml -O

下载完成后,进入到calico.yaml进行配置

# 修改 calico.yaml 文件中的 CALICO_IPV4POOL_CIDR 配置,修改为与初始化的 cidr 相同,这里的cidr实际上就是进行初始化时候配置的pod-network-cidr

配置完成后,直接通过如下命令部署即可

kubectl apply -f calico.yaml --force

通过如下命令查看pod状态

kubectl get po -n kube-system

如果出现这种情况

可以通过这个命令 

kubectl describe pod pod名称 -n 命名空间

博主这里遇到的是镜像拉取失败的问题,可以通过下面的命令,获取需要的镜像名称

grep image calico.yaml

这里也会涉及calico的版本问题,如果有需要,可自行查找版本对应关系

博主这里对所需镜像在三台机器上进行手动拉取(一定要三台机器都拉取,这里博主刚开始没想到,用了很长时间):

docker pull calico/cni:v3.20.6
docker pull calico/node:v3.20.6
docker pull calico/kube-controllers:v3.20.6
docker pull calico/pod2daemon-flexvol:v3.20.6

然后重新执行如下命令

kubectl apply -f calico.yaml

成功后会出现

如果到这里,就基本上是安装成功了,但是只有主节点能使用kubectl的情况,如果node节点也想使用,需要到这个目录下

vim /etc/kubernetes/admin.conf

这个文件中存储了相关的认证信息

我们可以使用如下命令,将文件拷贝到其它节点的相同目录下

 scp /etc/kubernetes/admin.conf root@节点名称:/etc/kubernetes

然后在其它节点执行如下命令,配置环境变量

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile

这样就可以在其它节点使用kubectl了

六.示例测试

这里启动一个nginx测试k8s是否安装成功,使用如下命令:

# 创建部署
kubectl create deployment nginx --image=nginx

# 暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort

# 查看 pod 以及服务信息
kubectl get pod,svc

箭头位置为容器外暴露的端口,我们直接在本地访问

更换其它节点ip,也能正常运行界面,至此,k8s集群部署完成。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐