Skip to content

k8s

发表于
更新于
字数
阅读量

1.配置主机名、ip地址解析、网桥

master 控制节点

bash
hostnamectl set-hostname k8s-master

工作节点

bash
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02
bash
vi /etc/hosts

填写之前配好的主机名,和对应的内网地址。每个节点都要这么把集群内所有节点的主机名IP配上。

172.26.48.34 k8s-master
172.26.48.33 k8s-node01
172.26.48.32 k8s-node02
cat << 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,所有节点主机都要装

bash
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 -a

2.方案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.toml
vi /etc/containerd/config.toml

65行 sandbox_image,国外服务器只需要把 "pause:3.8" 改成 "pause:3.9",国内改成 "registry.aliyuncs.com/google_containers/pause:3.9"。 137行 SystemdCgroup,false改成true。

启动\验证

bash
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 containerd

3.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: systemd

kubeadm初始化

bash
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/config

Then 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 nodes

4.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。

bash
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 nodes

5.主节点成为工作节点 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
必要时删除@sha
apiVersion: 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或命令行工具监控微服务运行情况,并根据需求对微服务进行水平扩展或缩减。