k8s
1.配置主机名、ip地址解析、网桥
master 控制节点
hostnamectl set-hostname k8s-master工作节点
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02vi /etc/hosts填写之前配好的主机名,和对应的内网地址。每个节点都要这么把集群内所有节点的主机名IP配上。
172.26.48.34 k8s-master
172.26.48.33 k8s-node01
172.26.48.32 k8s-node02cat << EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
lsmod | egrep overlay
lsmod | egrep br_netfilter
cat << EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system安装ipset ipvsadm,所有节点主机都要装
apt install ipset ipvsadm配置ipvsadm 添加模块、创建加载模块脚本
cat << EOF | tee /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF
cat << EOF | tee ipvs.sh
#!/bin/sh
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
sh ipvs.sh
lsmod | grep ip_vs关闭SWAP分区,所有节点主机都要关闭
swapoff -a2.方案Containerd容器运行时安装部署
所有节点主机都要装
下载 1.7.11版本
wget https://github.com/containerd/containerd/releases/download/v1.7.11/cri-containerd-1.7.11-linux-amd64.tar.gz解压到根目录、生成配置文件
tar xf cri-containerd-1.7.11-linux-amd64.tar.gz -C /
mkdir /etc/containerd
containerd config default > /etc/containerd/config.tomlvi /etc/containerd/config.toml65行 sandbox_image,国外服务器只需要把 "pause:3.8" 改成 "pause:3.9",国内改成 "registry.aliyuncs.com/google_containers/pause:3.9"。 137行 SystemdCgroup,false改成true。
启动\验证
systemctl enable --now containerd
containerd --version
systemctl status containerd编辑 containerd 的配置文件,通常是 /etc/containerd/config.toml,增阿里云的 Docker 镜像
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://iro0ypfv.mirror.aliyuncs.com"]
完成后
sudo systemctl restart containerd3.K8S部署
以下所有节点都要做
apt-get update && apt-get install -y apt-transport-https
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/deb/Release.key |
gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/deb/ /" |
tee /etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
kubectl version然后操作主节点master节点 下面这一堆都是操作master节点!!
Ubuntu 22.04搭建 K8S 1.29+Calicao网络+Kuboard 超详细-CSDN博客
先生成kubeadm配置文件
kubeadm config print init-defaults > kubeadm-config.yaml修改配置文件
nodeRegistration:name 这个是注册k8s节点时候的名字可改可不改
advertiseAddress 换成自己的内网ip
name: k8s-master 改为自己主机名
imageRepository 根据情况换 registry.aliyuncs.com/google_containers
networking加上 podSubnet: 10.244.0.0/16
最后换kubelet内核驱动 末尾加上
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemdkubeadm初始化
kubeadm init --config kubeadm-config.yaml成功会显示Your Kubernetes control-plane has initialized successfully!
需要根据提示生成kubectl配置文件
执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/configThen you can join any number of worker nodes by running the following on each as root:
kubeadm join 172.26.48.34:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:d9e75d86a774a0105a0460a497711955e09c787afd475784748aea1e191fbb56
这个命令中有一个 --token ,它是会过期的,过期时间好像是 24小时 ,如果 token 过期了,执行:
kubeadm token create
生成新的 token,替换命令中的 --token。kubeadm join命令后面的--discovery-token-ca-cert-hash如果你也没记下来的话,可以从主节点的CA证书中提取哈希值,执行:
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null \
| sha256sum | awk '{print $1}'
同样的,提取到的哈希值替换命令中--discovery-token-ca-cert-hash的值就行这段就是集群添加worker node的命令,这是临时的。到非master节点去执行,加入到集群中。到master节点执行
kubectl get nodes4.Calico部署
操作在主节点上 master
第1步
#方案一 下载calico.yml ok
curl https://docs.tigera.io/archive/v3.25/manifests/calico.yaml -O
替换命令
$ sed -i "s#k8s.gcr.io/pause#registry.cn-hangzhou.aliyuncs.com/google_containers/pause#g" /etc/containerd/config.toml
initmaster 上面配置的 --pod-network-cidr=192.169.0.0/16,
# - name: CALICO_IPV4POOL_CIDR
# value: "192.168.0.0/16"
查询yaml里用到的image,可预先下载
grep image calico.yaml
手动拉取 Calico 镜像
sudo ctr image pull quay.io/calico/cni:v3.26.4
sudo ctr image pull quay.io/calico/pod2daemon-flexvol:v3.26.4
sudo ctr image pull quay.io/calico/kube-controllers:v3.26.4
sudo ctr image pull quay.io/calico/node:v3.26.4
sudo ctr image pull quay.io/calico/typha:v3.26.4
sudo ctr image pull quay.io/calico/pod2daemon-flexvol:v3.26.4
docker.io/calico/pod2daemon-flexvol:v3.26.4
calico.yaml --------------
将docker.io => quay.io
kubectl create -f calico.yaml
kubectl apply -f calico.yaml
watch kubectl get pods -n calico-system -o wide
kubectl get pod -A
kubectl get nodes
查看插件状态
kubectl get pods -n kube-system所有pod都是running状态,ready状态,就是组网成功了。
这里强调一下,如果calico-node都不是1/1 ready状态,都是0/1,那么肯定是你原生网络环境有问题。我在这步就掉坑里了,calico BGP模式组网,node间通讯要走TCP,179端口,还有各种烂七八糟的端口,都要能通的。云服务搭建的同学一定要注意这点,先把安全组配好。
TCP:179 5473 6666 6443 2379 2380
UDP:4789
但还是建议按范围开端口,这些端口是有可能变化的。
如果大多数是1/1,一部分或者某个calico-node是0/1,那么大概率就是网卡错误。先看pod日志,如果看到“Readiness probe failed: calico/node is not ready: BIRD is not ready”,那基本就是网卡不对,节点的ip获取不到。那么就看下你正在使用的网卡是啥,本文是tigera-operator搭建calico,那就修改tigera-operator.yaml。指定网卡,或者正则匹配网卡。我当前使用的网卡是eht0,那就指定为eth0。
wget https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/tigera-operator.yaml
kubectl create -f tigera-operator.yaml
kubectl delete -f tigera-operator.yaml
第二步将配置文件下载下来,因为要改内容:
wget https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/custom-resources.yaml
然后修改
cidr: 192.168.0.0/16 改成 10.244.0.0/16
改完保存执行,然后
kubectl create -f custom-resources.yaml
notready
查看特定 Pod 的事件和状态
kubectl describe pod calico-typha-656ffc4547-fg6ls -n calico-system
kubectl delete -f custom-resources.yaml
查看网络创建过程
watch kubectl get pods -n calico-system -o wide
#查看calico状态
kubectl get po -n calico-system
kubectl apply -f custom-resources.yaml
watch kubectl get pods -n calico-system -o wide
kubectl get pod -A
kubectl get nodes5.主节点成为工作节点 worker node
如果你只想在本机上运行所有的 Pod,那么只需要将主节点配置为工作节点,以便它可以调度并运行工作负载。在主节点上启用调度器,一般是移除主节点上的 污点(taint),这些污点会阻止调度器将工作负载调度到主节点。执行命令查看都有哪些污点:
kubectl describe node <主节点的名字,就是我们设置的主机名hostname> | grep Taints
# 我的是:
kubectl describe node k8s-master | grep Taints
Taints: node-role.kubernetes.io/control-plane:NoSchedule
# 然后再删除这个污点:
kubectl taint nodes k8s-master node-role.kubernetes.io/control-plane-
现在主节点上也会被部署 Pod 了。6.Kuboard可视化工具部署
wget https://addons.kuboard.cn/kuboard/kuboard-v3-swr.yaml
修改几个地方
注释掉KUBOARD_SERVER_NODE_PORT: '30080'
加上KUBOARD_ENDPOINT: 'http://192.168.0.241:30080'
192.168.0.241 换成你集群随便一个节点的内网IP
#KUBOARD_SERVER_NODE_PORT: '30080'
KUBOARD_ENDPOINT: 'http://192.168.0.241:30080'
128行 镜像拉取策略改成 IfNotPresent
221行也是
改好后
kubectl apply -f kuboard-v3-swr.yaml
watch kubectl get pods -n kuboard
浏览器访问 http://8.155.3.235:30080
如果你是云服务搭建的同学,那IP就是你集群随便一个节点的公网IP地址哈
初始账户密码 admin Kuboard123
然后就是导入集群信息
点添加集群
选择KubeConfig
然后把你之前生成的 .kube文件夹下的config里的内容直接粘里,集群名称和描述,自己填好,最后确定。7.部署 ingress 接收外部流量转发到 service
首先得明确 ingress 其实也是一个 service,它接收外部的流量转发到配置好的指定了的 service,所以当我们部署 ingress-nginx 时会发现生成了一个关于 ingress 的 service; ingress-nginx
curl -O https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.10.1/deploy/static/provider/cloud/deploy.yaml修改kind: ConfigMap 下面 kind: Service处的两个地方:
上面的从 Local 改为 Cluster LoadBalancer 改为 NodePort
kubectl apply -f deploy.yaml
kubectl delete -f deploy.yaml
查看 ingress 暴露的端口
kubectl get svc -A
ingress-nginx ingress-nginx-controller NodePort 10.107.95.35 <none> 80:31207/TCP,443:30765/TCP
显示为31207 ,配置一个 ingress 资源,编辑一个 yaml 加入:
kubectl get pods -n ingress-nginx
kubectl describe pod ingress-nginx-admission-patch-2hlgc -n ingress-nginx
sudo ctr image pull registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.4.1
registry.k8s.io/ingress-nginx/controller:v1.10.1
sudo ctr image pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.4.1
sudo ctr image pull registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.10.1
必要时删除@shaapiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
namespace: default
spec:
rules:
- host: mynginx.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-nginx
port:
number: 80这个配置文件的作用是创建一个 Ingress,并且将 mynginx.com 的流量都转发到 my-nginx 这个 service 的80端口中去,在win机上编辑hosts文件(C:\Windows\System32\drivers\etc),加入 192.168.10.10 mynginx.com,浏览器访问 http://mynginx.com:32536就能访问到我们部署的 Nginx Pod了。
由Deployment确定部署的pod数量、使用的镜像等;由Service对外统一暴露访问端口。并使用NFS进行资源挂载,使用env传递容器环境变量。
8.部署微服务到Kubernetes中
许多人所说的 Docker 镜像,实际上是以 Open Container Initiative(OCI)格式打包的镜像。containerd 和 CRI-O 都可以运行 Docker 格式(实际上是 OCI 格式)的镜像,它们只是无需使用 docker 命令或 Docker 守护程序。
创建Docker镜像: 首先,将微服务代码打包成Docker镜像,确保Dockerfile正确配置,可以构建出可运行的镜像。
编写Kubernetes配置文件: 创建Deployment和Service的YAML配置文件,定义微服务的部署和暴露方式。
部署到Kubernetes集群: 使用kubectl命令将配置文件部署到Kubernetes集群中,Kubernetes会根据配置文件创建Pod、ReplicaSet和Service来运行微服务。
监控和扩展微服务: 可以使用Kubernetes Dashboard或命令行工具监控微服务运行情况,并根据需求对微服务进行水平扩展或缩减。