kubernetes学习(一)kubernetes-搭建

目录

1、准备环境

2、系统配置

3、安装容器运行时

4、安装cri-dockerd(1.24以下版本跳过这一步)

5、安装kubernetes集群组件

6、可能会出现的问题

7、kubernetes命令补全设置


1、准备环境

系统版本:centos 7.6或者rocky系统

内核版本:3.10.0-957.el7.x86_64,这个内核版本有点低了,随着centos停止维护,rocky目前正在逐渐替代centos

Rocky Linux 由 Gregory Kurtzer 创立,是由 CentOS 项目的原班人马发起并创建的一个开源企业级 Linux 发行版,centos的

k8s-msater192.168.176.101
k8s-node1192.168.176.102
k8s-node2192.168.176.103

 kubernetes yum源国内只到1.23版本,我用的1.29。不过原理是一样的就是1.24版本开始需要加cri-dockerd插件

#华为Kubernetes Yum源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo 
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.huaweicloud.com/kubernetes/yum/repos/kubernetes-el7-$basearch 
enabled=1 
gpgcheck=1 
repo_gpgcheck=0
gpgkey=https://mirrors.huaweicloud.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.huaweicloud.com/kubernetes/yum/doc/rpm-package-key.gpg 
EOF


#官方Kubernetes Yum源
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF


#华为Docker Yum源,如果之前安装过的话先卸载docker依赖
yum remove docker docker-common docker-selinux docker-engine
yum install -y yum-utils device-mapper-persistent-data lvm2

wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo

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

yum clean all && yum makecache

2、系统配置

#时至今日交换分区没什么意义了,官方建议关掉
swapoff -a
sed -i '/swap/s/^/#/g' /etc/fstab

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

#关闭selinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

#开机加载内核,这个内核的作用是所有网桥的流量都要经过iptables的处理,默认是加载的可以losmod查一下,这是docker所需要的设置
echo "br_netfilter" >> /etc/modules-load.d/bridge.conf
modprobe br_netfilter
lsmod | grep br_netfilter

#开机加载内核,k8s后续更换Service的底层负载方式ipvs要用的
cat >> /etc/modules-load.d/ipvs.conf << EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
EOF

#将三台服务器域名映射追加进文件
cat >> /etc/hosts << EOF
192.168.176.101    k8s-master
192.168.176.102    k8s-node1
192.168.176.103    k8s-node2
EOF

在分别修改三台主机名
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2

3、安装容器运行时

容器运行时就是负责“运行容器”的工具,管理容器的创建、启动和停止,不用想的过于复杂。podman,containerd、CRI-O等都是和docker一样的工具都叫容器运行时。docker的容器实现就是containerd,docker只不过是管理containerd的一个轻量级沙箱

docker和kubernetes是有官方推荐对应版本的,不对应会有什么问题我是没遇到过,只是提醒一下大家,下面的网址是k8s 1.29版本官方推荐的docker版本
kubernetes/CHANGELOG/CHANGELOG-1.29.md at master · kubernetes/kuberneteshttps://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.29.md各位同学和我版本不一致可以在对应版本打开页面在Dependencies(依赖性)下寻找

yum -y install docker-ce-20.10.24 ipvsadm(ipvs的管理工具)

#要先启动,不然不会生成/etc/docker目录
systemctl start docker
systemctl enable docker

#配置镜像加速和文件驱动
cat >> /etc/docker/daemon.json << EOF
{
    "registry-mirrors": [ "xxxxxxxxxx" ],
    "exec-opts": [ "native.cgroupdriver=systemd" ]
}
EOF
#"exec-opts": [ "native.cgroupdriver=systemd" ]设置cgroup驱动,k8s默认是systemd,docker要保持一致
#cgroups 的全称是 Linux Control Groups,主要作用是限制、记录和隔离进程组(process groups)使用的物理资源(cpu、memory、IO 等)
#systemd是系统自带的cgroup管理器, 系统初始化就存在的, 和cgroups联系紧密,为每一个进程分配cgroups, 用它管理就行了. 如果设置成cgroupfs就存在2个cgroup控制管理器, 实验证明在资源有压力的情况下,会存在不稳定的情况.

systemctl daemon-reload
systemctl restart docker


#开启路由转发,这是docker所需要的设置.不设置这个参数k8s集群内域名解析会报错,而且集群启动后dns pod也会报错53端口没权限,没试过猜测是这个原因
echo "net.ipv4.ip_forward=1" >>  /etc/sysctl.conf

#控制桥接网络接口bridge interface的数据包是否经过iptables规则的过滤。如果启用(设置为 1),当桥接设备接收到的数据包需要路由时,会经过Linux内核的iptables规则检查。
echo "net.bridge.bridge-nf-call-iptables=1" >>  /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-ip6tables=1" >>  /etc/sysctl.conf

sysctl -p    #加载参数

4、安装cri-dockerd(1.24以下版本跳过这一步)

kubernetes从1.24(包括1.24)版本后移除了dockershim,如果不装这个的话k8s初始化会报错。他的作用是与kubernetes提供的标准容器容器运行时接口CRI(Container Run Interface)进行对接

简单来讲就是将k8s说的话翻译给docker听,1.24版本后移除了此组件。因为增加了k8s官方的维护成本,移除这个组件后导致docker听不懂k8s的话了,无法对接k8s(才有了k8s放弃docker的说法),后来docker和一个叫mirans的公司接过了此项运维工程,开发了cri-docker来保持docker和k8s的对接

这是k8s大于1.23版本没装cri-dockerd的报错贴图

wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.9/cri-dockerd-0.3.9.arm64.tgz


tar -xf cri-dockerd-0.3.9.amd64.tgz
cp cri-dockerd/cri-dockerd /usr/bin/cri-dockerd
chmod +x /usr/bin/cri-dockerd


#创建服务控制文件(官方提供)
cat >> /usr/lib/systemd/system/cri-docker.service << EOF
[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.k8s.io/pause:3.9
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
#--network-plugin=cni 指定网络插件为CNI
#--pod-infra-container-image 指定Pod的基础镜像,没有梯子的话可以用阿里云的registry.cnhangzhou.aliyuncs.com/google_containers/pause:3.9


创建服务套接字文件(官方提供)
cat >> /usr/lib/systemd/system/cri-docker.socket << EOF
[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

systemctl daemon-reload
systemctl start cri-docker
systemctl enable cri-docker
systemctl status cri-docker

以上步骤三个节点同步执行
到这一步重启下三个节点,保证某些配置生效,比如主机名,因为k8s集群会把当前主机名称作为节点名称,但是每台主机都是localhost的话会导致节点无法加入集群,当然也可以手动改名不重启,我习惯重启

5、安装kubernetes集群组件

#全部节点安装
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
#在某些环境中,操作系统(例如 CentOS 或 RHEL)的软件包管理配置可能会在 yum 的配置文件中排除了默认仓库中部分软件包;官方要求使用指定的 Kubernetes 软件源(如 Google 的 Kubernetes 源)。如果操作系统的 yum 配置文件中有 exclude=kubernetes* 的规则,则默认会排除这些包。使用 --disableexcludes=kubernetes 可以忽略这些规则,从而安装或升级相关组件

#全部节点设置kubelet开机自起,不然kubeadm初始化会提示报错
systemctl enable --now kubelet

回到master节点
kubeadm init \
--apiserver-advertise-address 192.168.176.101 \#指定master节点
--kubernetes-version 1.29.11 \    #指定kubernetes版本
--service-cidr 10.96.0.0/12 \    #指定服务网络的地址范围,关于为什么可以问问gpt
--pod-network-cidr 10.244.0.0/16 \    #指定Pod网络的地址范围,关于为什么可以问问gpt
--cri-socket unix:///var/run/cri-dockerd.sock    #要连接的CRI套接字的路径,使用cri-docker组件一定要加这个参数

#--image-repository这个选项是指定拉取控制平面镜像的容器仓库,我有梯子所以默认用的k8s的仓库,没有的话可以用阿里云的registry.aliyuncs.com/google_containers

#安装成功后会提示执行命令,直接复制执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

#让node节点加入集群,根据安装成功后会给出命令,这个命令每个人不一样的,根据你们自己的来,并且后面也加--cri-socket指定套接字,来到剩下的两个节点执行命令
kubeadm join 192.168.176.101:6443 --token 7u9cre.th9o2v0l18krhbgw \
	--discovery-token-ca-cert-hash --sha256:b14b7ca3c8e3e30e9d3c2847192024508e19bf5b3cff9e5a5d64bc1728ec7698 --cri-socket unix:///var/run/cri-dockerd.sock


#安装网络插件
wget https://github.com/projectcalico/calico/archive/refs/tags/v3.29.1.tar.gz
tar -xf calico-3.29.1.tar.gz
cd calico-3.29.1/manifests/
vim calico.yaml
将这个
- name: CALICO_IPV4POOL_IPIP
  value: "Always"
改为
- name: CALICO_IPV4POOL_IPIP
  value: "Off"    #意思是关闭IPIP模式,启动BGP模式

和这个
# - name: CALICO_IPV4POOL_CIDR
#   value: "192.168.0.0/16"
改为
- name: CALICO_IPV4POOL_CIDR
  value: "10.244.0.0/16"    #这个是指定pod网络网段的,要和初始化保持一致
保存退出


#根据kubeadm安装成功后给出的命令指定yaml文件安装网络插件
kubectl apply -f calico.yaml

完成,可能有的同学会慢一些,多等一会

calico插件太深奥,详细模式说明我会附上大佬的讲解

Calico-介绍、原理与使用_calico的三种模式-优快云博客 这个大佬很厉害

关于k8s的网络组件,现场使用范围最广的就是calico,在他之前是Flannel。当然看同学们各位自己的需求,不必非和我一样

6、可能会出现的问题

部署结束后kubectl get pod -n kube-sytecm会发现有两个dns的pod启动不了。这个问题是由于内核版本过低导致的,升级下内核版本

或者修改控制器配置,这个方法是官方提供的。允许绑定1024以下高级端口

kubectl -n kube-system get deployment coredns -o yaml | \
  sed 's/allowPrivilegeEscalation: false/allowPrivilegeEscalation: true/g' | \
  kubectl apply -f -

7、kubernetes命令补全和别名设置

yum -y install bash-completion
echo 'source <(kubectl completion bash)' >> ~/.bashrc


常用别名设置,看需求
cat >> ~/.bashrc << EOF 
alias k='kubectl'
alias kg='kubectl get'
alias kd='kubectl describe'
alias ke='kubectl explain'
alias ka='kubectl apply'
EOF


别名补全
complete -F __start_kubectl k
complete -F __start_kubectl kg
complete -F __start_kubectl kd
complete -F __start_kubectl ke
complete -F __start_kubectl ka
source ~/.bashrc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值