gradient

Kubernetes食用方法(部署篇)

rain

前言

Kubernetes 也称为 K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统。

它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现。Kubernetes 源自Google 15 年生产环境的运维经验,同时凝聚了社区的最佳创意和实践。

Kubernetes 也是支持很多特性,例如

自动化上线和回滚

Kubernetes 会分步骤地将针对应用或其配置的更改上线,同时监视应用程序运行状况以确保你不会同时终止所有实例。如果出现问题,Kubernetes 会为你回滚所作更改。你应该充分利用不断成长的部署方案生态系统。

服务发现与负载均衡

你无需修改应用来使用陌生的服务发现机制。Kubernetes 为每个 Pod 提供了自己的 IP 地址并为一组 Pod 提供一个 DNS 名称,并且可以在它们之间实现负载均衡。

自我修复

重新启动失败的容器,在节点死亡时替换并重新调度容器, 杀死不响应用户定义的健康检查的容器, 并且在它们准备好服务之前不会将它们公布给客户端。

存储编排

自动挂载所选存储系统,包括本地存储、公有云提供商所提供的存储或者诸如 iSCSI 或 NFS 这类网络存储系统。

Secret 和配置管理

部署和更新 Secret 和应用程序的配置而不必重新构建容器镜像, 且不必将软件堆栈配置中的秘密信息暴露出来。

自动装箱

根据资源需求和其他限制自动放置容器,同时避免影响可用性。 将关键性的和尽力而为性质的工作负载进行混合放置,以提高资源利用率并节省更多资源。

批量执行

除了服务之外,Kubernetes 还可以管理你的批处理和 CI 工作负载,在期望时替换掉失效的容器。

IPv4/IPv6 双协议栈

为 Pod 和 Service 分配 IPv4 和 IPv6 地址

水平扩缩

使用一个简单的命令、一个 UI 或基于 CPU 使用情况自动对应用程序进行扩缩。

为扩展性设计

无需更改上游源码即可扩展你的 Kubernetes 集群。

正言

既然Kubernetes支持这么多特效,那么现在开始部署吧

1.前期准备

1.1关闭Selinux

临时关闭(这里关闭了,重启了还是会恢复)
setenforce 0
永久关闭
sed -i -r ‘s/SELINUX=[ep].*/SELINUX=disabled/g’ /etc/selinux/config

1.2关闭swap(以前是性能不够,内存不够的情况下开启swap,在性能够的情况下,就不需要这个东西了)

临时关闭(这里关闭了,重启了还是会恢复)
swapoff –all
永久关闭swap
sed -i -r ‘/swap/ s/^/#/’ /etc/fstab

1.3关闭防火墙

查看防火墙状态
systemctl status firewalld.service
临时关闭防火墙(这里关闭了,重启了还是会运行)
systemctl stop firewalld.service
再次查看防火墙状态
systemctl status firewalld.service
关闭防火墙自启动(这样它开机就不会启动了 hhhhh)
systemctl disable firewalld.service

1.4 更换我们的系统源,这里我使用的是Cetnos7.9 替换的阿里源

备份系统源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
下载阿里源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
生成缓存
yum clean all && yum makecache

1.5 下载Docker,Kubernetes源,由于后面会使用,我们就在这里下载了

安装yum-utils
yum install -y yum-utils
下载docker源
yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo

配置kubernetes源,这里使用的是阿里源的
cat < /etc/yum.repos.d/kubernetes.repo
[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

官网的如下
cat < [kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.28/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF

这里我们再次生成缓存
生成缓存
yum clean all && yum makecache

1.6替换内核

参考前面的文章,这里不再赘述,传送门

1.7内核网络参数优化

添加内核参数
cat <<EOF >/etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness=0
EOF

加载网桥过滤器模块(这里一定要先执行,再去执行加载命令,不然会报错not found)
modprobe br_netfilter
加载内核配置文件
sysctl -p /etc/sysctl.d/kubernetes.conf
验证网桥过滤器模块
lsmod | grep br_netfilter

1.8安装ipvs,ipvsadm

安装ipset及ipvsadm
yum -y install ipset ipvsadm
配置ipvsadm模块加载方式.添加需要加载的模块
cat > /etc/sysconfig/modules/ipvs.module <<EOF
modprobe — ip_vs
modprobe — ip_vs_sh
modprobe — ip_vs_rr
modprobe — ip_vs_wrr
modprobe — nf_conntrack
EOF

授权、运行、检查是否加载
chmod 755 /etc/sysconfig/modules/ipvs.module && /etc/sysconfig/modules/ipvs.module
lsmod | grep -e ip_vs -e nf_conntrack

1.9安装Docker

检查本地是否存在docker,并查看当前安装版本
rpm -qa|grep docker
如果docker 和kubernetes版本不兼容,则执行
卸载docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
安装与kubernetes兼容的docker,这里我由于是新机器,没有docker,就安装最新版本的docker
直接yum安装docker,前期我们已经把docker的源已经添加了
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
配置docker配置文件
mkdir -p /etc/docker (这个文件默认是没有的,需要手动创建)
配置文件内容如下
cat > /etc/docker/daemon.json <<EOF
{
“registry-mirrors”: [“阿里镜像加速器”],
“exec-opts”: [“native.cgroupdriver=systemd”]
}
EOF

启动Docker
systemctl start docker
设置docker自启动
systemctl enable docker
使用docker info 查看我们的配置文件是否生效
docker info
如果是先启动docker,再去配置docker配置文件,则需要执行以下命令
systemctl daemon-reload
systemctl restart docker
再次使用docker info 查看我们的配置文件是否生效
docker info

1.10安装cri-dockerd

由于之前Kubernetes一直都是通过dockershim去调用底层的docker daemon也就是后面的containerd(这个containerd是Docker将docker engine拆分后,2017年将其中的docker daemon部分捐献给了CNCF基金会,形成的),但是呢 Kubernetes觉得太麻烦了 它既要它自己的CRI标准(这个标准规定k8s该如何调用容器运行时去管理容器和镜像)同时为了兼容docker(因为它用户量太庞大了),产生了转换适配组件(dockershim)。
后面这个被Docker捐出去的docker daemon也就是containerd,它自己去发行了一个1.1版本,正式支持CRI标准,与k8s实现集成,所以Kubernetes就觉得反正我都有docker daemon也就是containerd,索性就不支持了dockershim。就宣布我后面要单飞了,弃用对Docker的支持,删dockershim。
后面在Kubernetes,在1.24版本,正式剔除dockershim,但是没办法呀,始终docker用户的体量在这里,所以就出现了一个名为cri-dockerd的把dockerd作为Kubernetes兼容的CRI容器接口。话不多说,我们这里开始安装

在github下载对应系统的安装包
下载地址https://github.com/Mirantis/cri-dockerd/releases
安装cri-dockerd
这里我下载的是rpm包
rpm -ivh cri-dockerd-0.3.5.20231011155914.a6fd1759-0.el7.x86_64.rpm

修改server
在/usr/lib/systemd/system/cri-docker.service 中修改Service 为下面内容
[Service]
Type=notify ExecStart=/usr/bin/cri-dockerd –network-plugin=cni –pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9

修改完成后启动(这里一定要先启动Docker 在启动这个如果docker没有启动 直接启动这个会报错)
systemctl start cri-docker
查看状态
systemctl status cri-docker

到此前期准备完成

2.安装Kubernetes

2.1这里安装的是最新版本1.28.2

查看所有的可用版本
yum list kubeadm kubelet kubectl –showduplicates | sort -r
安装kubeadm,kubelet,kubectl
yum install kubeadm kubelet kubectl
查看版本
kubeadm version
设置开机自启动
systemctl enable kubelet
配置kubelet(这里的cgroup-driver要和docker的一致)
cat <<EOF > /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS=”–cgroup-driver=systemd”
EOF

2.2初始化kubernetes

使用kubeadm初始化集群
kubeadm init –image-repository registry.aliyuncs.com/google_containers –kubernetes-version=v1.28.2 –pod-network-cidr=10.244.0.0/16 –cri-socket /var/run/cri-dockerd.sock

出现以下内容则初始化成功

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 172.16.10.11:6443 –token yli0zl.nl5e8b0j4o2spmns \ –discovery-token-ca-cert-hash sha256:a1d2d36ada33fb7a785b9849f833dfeabb683c8005363b6cd14953fc17ed9d6d

按照上面的提示执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
如果使用的是root账户初始化的还应该执行下一句
export KUBECONFIG=/etc/kubernetes/admin.conf

执行完成后,使用kubectl get node查看node状态

查看node状态
kubectl get node
查看所有pod
kubectl get pod -A
查看所有命名空间
kubectl get ns -A

2.3安装网络插件

当我们使用kubectl get pod -A  查看所有pod 会发现2个名为coredns的pod状态为pending,这是因为我们没有网络插件,这里使用的是calico

下载calico yaml文件
wget https://docs.projectcalico.org/manifests/calico.yaml
修改calico yamlyaml文件

# no effect. This should fall within `–cluster-cidr`.
– name: CALICO_IPV4POOL_CIDR
value: “10.244.0.0/16”

这里的IP地址池和初始化的IP地址池的一样,修改完成后保存。
使用kubectl 安装calico
kubectl apply -f calico.yaml

也可以使用
cat calico.yaml |grep image
然后使用docker pull 对应的image

到此 kubernetes安装完毕。

Leave a Comment