最近在学习云原生的相关课程,接下来一段时间会每周更新一次相关实验,同时记录以下自己成长的过程,希望大家喜欢。
实验环境说明
k8s-master01 | 10.1.1.11 |
---|---|
k8s-node01 | 10.1.1.21 |
k8s-node02 | 10.1.1.22 |
k8s-node03 | 10.1.1.23 |
版本信息
Ubuntu 22.04arm64、Kubernetes:v1.28.2、Continerd.io 1.6.26
1环境配置要求:
设置主机名及解析,设定时钟同步,关闭swap和防火墙,开启IPv4转发。
1.设置主机名及解析
#设置主机名及解析
#master01
root@k8s-master01:~# cat /etc/hosts
10.1.1.11 k8s-master01.magedu.com k8s-master01 kubeapi.magedu.com kubeapi
10.1.1.12 k8s-master02.magedu.com k8s-master02
10.1.1.13 k8s-master03.magedu.com k8s-master03
10.1.1.21 k8s-node01.magedu.com k8s-node01
10.1.1.22 k8s-node02.magedu.com k8s-node02
10.1.1.23 k8s-node03.magedu.com k8s-node03
#node01和node02和node03配置一样的/etc/hosts
2.关闭swap和防火墙
root@k8s-master01:~# swapoff -a
# 注释/etc/fstab文件的最后一行
root@k8s-master01:~# sed -i '/swap/s/^/#/' /etc/fstab
root@k8s-master01:~# ufw status
Status: inactive
#node01和node02和node03也是执行关闭swap和防火墙一样的操作
3.开启IPv4转发
#四台服务器都需要开启IPv4转发
root@k8s-master01:~# cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
> overlay
> br_netfilter
> EOF
overlay
br_netfilter
root@k8s-master01:~# modprobe overlay
root@k8s-master01:~# modprobe br_netfilter
root@k8s-master01:~# cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
> net.bridge.bridge-nf-call-iptables = 1
> net.bridge.bridge-nf-call-ip6tables = 1
> net.ipv4.ip_forward = 1
> EOF
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
root@k8s-master01:~# sysctl --system
2安装containerd
通过apt安装containerd, 只能安装1.5.9,版本过低,参考k8s和containerd匹配要求,k8s 1.28.2最好使用containerd的1.6.26
#node01和node02和node03都需要安装containerd此操作
root@k8s-master01:~# curl -# -O https://mirrors.aliyun.com/docker-ce/linux/ubuntu/dists/jammy/pool/stable/amd64/containerd.io_1.6.26-1_amd64.deb
root@k8s-master01:~# dpkg -i containerd.io_1.6.26-1_amd64.deb
#导出默认配置
root@k8s-master01:~# containerd config default > /etc/containerd/config.toml
#编辑配置文件
root@k8s-master01:~# vim /etc/containerd/config.toml
1.#修改containerd使用SystemdCgroup
SystemdCgroup = true
2.#配置containerd使用国内mirror站点上的pause镜像及指定版本
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
3.#配置containerd使用国内的Image加速服务,以加速Image获取
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
#在此后面添加以下四行内容
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://docker.mirrors.ustc.edu.cn", "https://registry.docker-cn.com"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"]
endpoint = ["https://registry.aliyuncs.com/google_containers"]
#启动containerd服务
root@k8s-master01:~# systemctl enable containerd
root@k8s-master01:~# systemctl restart containerd
3配置crictl客户端
root@k8s-master01:~# vim /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: true
4安装kubuadm、kubelet、kubectl
首先,在各主机上生成kubulet、kubeadm等相关程序包的仓库,这里以阿里云的镜像服务为例:
root@k8s-master01:~# apt update && apt install -y apt-transport-https curl
root@k8s-master01:~# curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
OK
root@k8s-master01:~# cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
> deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
> EOF
root@k8s-master01:~# apt update
root@k8s-master01:~# apt install -y kubelet kubeadm kubectl
root@k8s-master01:~# systemctl enable kubelet
5初始化master节点
#列出镜像
root@k8s-master01:~# kubeadm config images list --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version="v1.28.2"
#拉取下载镜像
root@k8s-master01:~# kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version="v1.28.2"
#运行如下命令完成初始化
root@k8s-master01:~# kubeadm init --control-plane-endpoint="kubeapi.magedu.com" --kubernetes-version=v1.28.2 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --image-repository=registry.aliyuncs.com/google_containers --upload-certs
#命令中的各选项说明:
--image-repository:指定要使用的镜像仓库,默认为registry.k8s.io;
--kubernetes-version:kubernetes程序组件的版本号,它必须要与安装的kubelet程序包的版本号相同;
--control-plane-endpoint:控制平面的固定访问端点,可以是IP地址或DNS名称,会被用于集群管理员及集群组件的kubeconfig配置文件的API Server的访问地址;单控制平面部署时可以不使用该选项;
-pod-network-cidr:Pod网络的地址范围,其值为CIDR格式的网络地址,通常,Flannel网络插件的默认为10.244.0.0/16,Project Calico插件的默认值为192.168.0.0/16;
--service-cidr:Service的网络地址范围,其值为CIDR格式的网络地址,默认为10.96.0.0/12;通常,仅Flannel一类的网络插件需要手动指定该地址;
root@k8s-master01:~# mkdir .kube
root@k8s-master01:~# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
root@k8s-master01:~# ls .kube/
config
root@k8s-master01:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master01 Ready control-plane 4m20s v1.28.2
6设定kubectl
kubectl是kube-apiserver的命令行客户端程序,实现了除系统部署之外的几乎全部的管理操作,是kubernetes管理员使用最多的命令之一。kubectl需经由API server认证及授权后方能执行相应的管理操作,kubeadm部署的集群为其生成了一个具有管理员权限的认证配置文件/etc/kubernetes/admin.conf,它可由kubectl通过默认的“$HOME/.kube/config”的路径进行加载。当然,用户也可在kubectl命令上使用–kubeconfig选项指定一个别的位置。
#复制认证为Kubernetes系统管理员的配置文件至当前用户root的家目录
root@k8s-master01:~# mkdir .kube
root@k8s-master01:~# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
root@k8s-master01:~# ls .kube/
config
#验证master节点已就绪
root@k8s-master01:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master01 Ready control-plane 4m20s v1.28.2
7部署网络插件
root@k8s-master01:~# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
root@k8s-master01:~# kubectl apply -f kube-flannel.yml
root@k8s-master01:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master01 Ready control-plane 95m v1.28.2
k8s-node01 Ready <none> 49m v1.28.2
k8s-node02 Ready <none> 48m v1.28.2
k8s-node03 Ready <none> 50m v1.28.2
8添加节点到集群中
节点所有配置与master节点一致,只是最后不需要执行初始化,而执行kubeadm jion来加入节点根据主节点初始化集群的输出,在Worker节点执行以下命令将该节点加入Kubernetes集群:
#在node01和node02和node03上分别执行,加入集群
kubeadm join kubeapi.magedu.com:6443 --token yn088m.z5xwy4ulhy8rt4kg --discovery-token-ca-cert-hash sha256:62d4f2572d762fa1565f57b19e2637fa4a0de71cf6af15e313e30a8b940deda1
新节点加入集群时token已过期,需要重新生成,在master执行如下命令
#新节点加入集群时token已过期,需要重新生成,在master执行如下命令
root@k8s-master01:~# kubeadm token create --print-join-command
9测试应用编排及服务访问
root@k8s-master01:~# kubectl create deployment demoapp --image=ikubernetes/demoapp:v1.0 --replicas=2
deployment.apps/demoapp created
root@k8s-master01:~# kubectl create service nodeport demoapp --tcp=80:80
service/demoapp created
root@k8s-master01:~# kubectl get svc -l app=demoapp
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
demoapp NodePort 10.108.245.120 <none> 80:31608/TCP 16s
root@k8s-master01:~# curl http://10.1.1.11:31608
iKubernetes demoapp v1.0 !! ClientIP: 10.244.0.0, ServerName: demoapp-7c58cd6bb-48p2g, ServerIP: 10.244.1.2!