大家好,又见面了,我是沐风晓月,本文是专栏【云原生实战】专栏的第5篇文章,主要讲解如何从零开始安装kubernetes。
专栏地址:【云原生实战】 , 此专栏是沐风晓月对云原生学习的汇总,希望能够加深自己的印象,以及帮助到其他的小伙伴。
原本我是写一篇文章叫 prometheus监控kubernetes实战,结果发现kubernetes就写了半天近一万字,所以把从零开始搭建kubernetes实战单独拿出来作为一篇文章吧。
如果文章有什么需要改进的地方还请大佬不吝赐教。
个人主页:我是沐风晓月
个人简介:大家好,我是沐风晓月,双一流院校计算机专业
座右铭: 先努力成长自己,再帮助更多的人 ,一起加油进步
欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信
在这里插入图片描述
本次的实验环境见下表:
操作系统 | 服务器IP | hostname |
---|---|---|
centos7.6 | 192.168.1.41 | k8s-master |
centos7.6 | 192.168.1.42 | k8s-node42 |
如何查看相应的参数:
[root@mufenggrow ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
## 修改hostname
[root@mufenggrow ~]# hostnamectl set-hostname mufenggrow41
[root@mufenggrow ~]# bash
# 查看hostname
[root@mufenggrow41 ~]# hostname
mufenggrow41
[root@mufenggrow41 ~]# ifconfig |grep inet |awk 'NR==1{print $2}'
192.168.1.41
Kubernetes 也称为 K8s,是Google开发的用于自动部署、扩缩和管理容器化应用程序的开源容器编排器技术。
k8s官网地址:https://kubernetes.io
在大流量,高并发的场景,如何实现应用的快速部署。 比如批量启动20台nginx,又如何在流量结束之后,关闭这些nginx服务。
一个容器宕机了,如何快速发现并立即启动一台新的容器去填补, 这些容器的管理问题,就是容器编排。
能做容器编排的工具有好几个,但k8s肯定是占主导地位的。
搭建k8s的方式,我们再这里选择了kubeadm的方式来部署。kubeadm 是官方社区推出的一个用于快速部署kubernetes 集群的工具,这个工具能通过两条指令完成一个kubernetes 集群的部署:
搭建实验环境,包含软件层面和硬件层面:
[root@mufenggrow ~]# lscpu |grep "CPU(s)"
CPU(s): 2
On-line CPU(s) list: 0,1
也可以用:
[root@mufenggrow ~]# cat /proc/cpuinfo |grep "cpu cores"
cpu cores : 2
cpu cores : 2
这里需要主要的是,用几台服务器操作,我们就需要设置几台服务器的环境:
1) 设置主机名见名知意
让192.168.1.41为k8s-master,设置主机名
[root@mufenggrow ~]# hostnamectl set-hostname k8s-master
[root@mufenggrow ~]# bash
[root@k8s-master ~]# hostname
k8s-master
192.168.1.42 为k8s-node 设置主机名
[root@mufeng ~]# hostnamectl set-hostname k8s-node42
[root@mufeng ~]# bash
[root@k8s-node42 ~]# hostname
k8s-node42
2) 设置/etc/hosts 一对一的映射关系
[root@k8s-master ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
[root@k8s-master ~]# cat >>/etc/hosts<< EOF
192.168.1.41 k8s-master
192.168.1.42 k8s-node42
EOF
[root@k8s-master ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.41 k8s-master
192.168.1.42 k8s-node42
3) 设置时间同步
我这里只截取了一台服务器执行的代码,因为两台要同步做,所以另一台执行的是一样的,需要两台同步执行一样的操作:
[root@k8s-master ~]# systemctl start chronyd
[root@k8s-master ~]# systemctl enable chronyd
[root@k8s-master ~]# date
2023年 02月 15日 星期三 10:46:09 CST
[root@k8s-master ~]#
4) 关闭防火墙和selinux
[root@k8s-master ~]# systemctl stop firewalld
[root@k8s-master ~]# setenforce 0
这里要注意: setenforce 0 只是临时关闭,如果要永久关闭需要到配置文件中设置
配置文件路径: /etc/selinux/config
kubernetes要求每个节点都要禁用swap设备
临时关闭:
[root@k8s-master ~]# swapoff -a
永久关闭:
vim /etc/fstab
注释掉 /dev/mapper/centos-swap swap
#/dev/mapper/centos-swap swap
永久关闭需要重启系统。
6) 修改内核参数
# 修改linux的内核采纳数,添加网桥过滤和地址转发功能
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
重新加载配置
# sysctl --system
因为k8s最终的管理是容器,所以我们需要再这里先安装docker,每台机器都需要安装。
1) 设置 repo
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
若没有yum-config-manager 需要先安装
[root@k8s-node42 ~]# yum install yum-utils
# mkdir /etc/docker
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://ywrd8tun.mirror.aliyuncs.com"]
}
EOF
[root@k8s-node42 ~]# yum install wget
[root@k8s-master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
3) 开始安装:
[root@k8s-node42 ~]# yum install -y docker-ce
[root@k8s-master ~]# systemctl start docker
[root@k8s-master ~]# systemctl enable docker
[root@k8s-master ~]# docker --version
Docker version 23.0.1, build a5ee5b1
从kubernetes 1.24开始,dockershim已经从kubelet中移除,但因为历史问题docker不支持kubernetes主推的CRI(容器运行时接口)标准,所以docker不能再作为kubernetes的容器运行时了,即从kubernetesv1.24开始不再使用docker了。
但是如果想继续使用docker的话,可以在kubelet和docker之间加上一个中间层cri-docker。cri-docker是一个支持CRI标准的shim(垫片)。一头通过CRI跟kubelet交互,另一头跟docker api交互,从而间接的实现了kubernetes以docker作为容器运行时。
技术的发展得益于人,受限于人。
开源地址 https://github.com/Mirantis/cri-dockerd
下载地址 https://github.com/Mirantis/cri-dockerd/releases
下载并上传进行解压
#使用rz命令上传
# rz
[root@k8s-node42 ~]# ls
anaconda-ks.cfg cri-dockerd-0.3.1.amd64.tgz
[root@k8s-node42 ~]# tar xf cri-dockerd-0.3.1.amd64.tgz
[root@k8s-node42 ~]# cp cri-dockerd/cri-dockerd /usr/bin/
[root@k8s-node42 ~]# chmod +x /usr/bin/cri-dockerd
[root@k8s-node42 ~]#
配置启动文件,如下:
cat <<"EOF" > /usr/lib/systemd/system/cri-docker.service
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket
[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
EOF
⽣成 socket ⽂件,执行如下命令
cat <<"EOF" > /usr/lib/systemd/system/cri-docker.socket
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
EOF
启动 cri-docker 并设置开机⾃动启动
[root@k8s-node42 ~]# systemctl daemon-reload
[root@k8s-node42 ~]# systemctl enable cri-docker --now
Created symlink from /etc/systemd/system/multi-user.target.wants/cri-docker.service to /usr/lib/systemd/system/cri-docker.service.
[root@k8s-node42 ~]# systemctl is-active cri-docker
active
[root@k8s-node42 ~]#
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
yum install -y kubelet-1.25.0 kubeadm-1.25.0 kubectl-1.25.0
查看版本并设置开机自启动
[root@k8s-master ~]# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"25", GitVersion:"v1.25.0", GitCommit:"a866cbe2e5bbaa01cfd5e969aa3e033f3282a8a2", GitTreeState:"clean", BuildDate:"2022-08-23T17:43:25Z", GoVersion:"go1.19", Compiler:"gc", Platform:"linux/amd64"}
[root@k8s-master ~]# systemctl enable kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
[root@k8s-master ~]#
到目前位置,所有的操作都是在全部节点上操作的。接下来我们开始初始化k8s-master的节点,此操作只在k8s-master上执行:
kubeadm 使用 eth0 的默认网络接口(通常是内网IP)做为 Master 节点的 advertise address .所以这里的IP地址要设置为你自己的IP地址:
kubeadm init \
--apiserver-advertise-address=192.168.1.41 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.25.0 \
--service-cidr=10.10.0.0/12 \
--pod-network-cidr=172.17.0.0/16 \
--cri-socket /var/run/cri-dockerd.sock \
--ignore-preflight-errors=all
注释:
--apiserver-advertise-address=192.168.1.41
这个参数就是master主机的IP地址
--image-repository=registry.aliyuncs.com/google_containers
这个是镜像地址,由于国外地址无法访问,故使用的阿里云仓库地址:registry.aliyuncs.com/google_containers
--kubernetes-version=v1.25.0
这个参数是下载的k8s软件版本号
--service-cidr=10.10.0.0/12
无需更改
--pod-network-cidr=172.17.0.0/16
Specify range of IP addresses for the pod network. If set, the control plane will automatically allocate CIDRs for every node.
该参数指明了 Pod 网络的 CIDR,以用于 Node 相关配置
若执行中出现问题,想要重新执行,可以先运行:
[root@k8s-master ~]# kubeadm reset -f
按照下图提示,在k8s-master上创建必要的文件,然后在用最后的join把别的加点加入
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
尤其注意最后一条,cri-socket ,这条容易漏掉。
kubeadm join 192.168.1.101:6443 --token 9rmt8j.2pqoh7drm68ns249 \
--discovery-token-ca-cert-hash sha256:ff558174c47aba532fef2920f80e1f48976d4712a970eba1a7fac0428c8373ab
--cri-socket /var/run/cri-dockerd.sock
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane 5m5s v1.25.0
k8s-node42 NotReady <none> 75s v1.25.0
[root@k8s-master ~]#
接下来需要配置网络:
每个节点手动通过docker离线加载镜像:
37 docker load -i calico~cni~v3.24.3.tar.gz
38 docker load -i calico~kube~controllers~v3.24.3.tar.gz
39 docker load -i calico~node~v3.24.3.tar.gz
在master安装 网络插件:
[root@k8s-master ~]# kubectl apply -f calico.yaml
poddisruptionbudget.policy/calico-kube-controllers created
serviceaccount/calico-kube-controllers created
再次执行,这里显示的就是ready
创建nginx服务
[root@k8s-master ~]# kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
暴露端口:
[root@k8s-master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed
[root@k8s-master ~]# kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-76d6c9b8c-hw6bz 1/1 Running 0 16s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 17m
service/nginx NodePort 10.15.105.20 <none> 80:32587/TCP 7s
测试:
[root@k8s-master ~]# curl 127.0.0.1:32587
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
以上就是无坑版本最新的k8s实战的全部过程了,耗时4个小时,终于完成。看到这里的小伙伴给点个三连呀。
每日鸡汤: 人活到极致,一定要素与简
✨ 原创不易,还希望各位大佬支持一下 \textcolor{blue}{原创不易,还希望各位大佬支持一下} 原创不易,还希望各位大佬支持一下
点赞,你的认可是我创作的动力! \textcolor{green}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向! \textcolor{green}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富! \textcolor{green}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!