搭建k8s 1.28集群

实验环境
192.168.0.21 jichao21
192.168.0.22 jichao22
192.168.0.23 jichao23

系统 rocky9.5
更改Hosts文件

免密登录

./fgssg -user root -hosts "jichao21 jichao22 jichao23" -advanced -exverify -confirm

时间同步

https://developer.aliyun.com/mirror/NTP?spm=a2c6h.13651102.0.0.5a991b11xhPhjB

server ntp.aliyun.com iburst
stratumweight 0
driftfile /var/lib/chrony/drift
rtcsync
makestep 10 3
bindcmdaddress 127.0.0.1
bindcmdaddress ::1
keyfile /etc/chrony.keys
commandkey 1
generatecommandkey
logchange 0.5
logdir /var/log/chrony




chkconfig  chronyd  on
timedatectl  
systemctl  restart  chronyd    #重启校时服务
systemctl  enable  chronyd     #开机自启


ln  -sf  /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime 
echo 'Asia/Shanghai' > /etc/timezone

最大使用权限

vim /etc/default/grub
numa=off
numactl --show

系统句柄数

ulimit -SHn 65535
cat >> /etc/security/limits.conf <<EOF
* soft nofile 655360
* hard nofile 131072
* soft nproc 655350
* hard nproc 655350
* seft memlock unlimited
* hard memlock unlimitedd
EOF
ulimit -a

关闭swap


swapoff  -a
sed  -ri  's/.*swap.*/#&/'   /etc/fstab
cat  /etc/fstab

依赖包

yum install -y htop iftopconntrack ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git

yum install -y lrzsz git subversion numactl gpm unzip wget curl net-tools gpm gcc  gcc-c++  zip unzip  make

yum -y install wget jq psmisc vim net-tools nfs-utils telnet yum-utils device-mapper-persistent-data lvm2 git network-scripts tar curl -y

cat > /etc/sysctl.d/k8s_better.conf << EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
modprobe  br_netfilter
lsmod |grep  conntrack
modprobe  ip_conntrack
sysctl  -p  /etc/sysctl.d/k8s_better.conf

#ipvs转发
modprobe br_netfilter
# 这块需要先创建
mkdir -p /etc/sysconfig/modules/
cat > /etc/sysconfig/modules/ipvs.modules << EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules
bash /etc/sysconfig/modules/ipvs.modules
#重启服务
systemctl restart systemd-modules-load.service
lsmod | grep -e ip_vs -e nf_conntrack


cat >> /etc/modules-load.d/ipvs.conf <<EOF 
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip
EOF

systemctl restart systemd-modules-load.service
lsmod | grep -e ip_vs -e nf_conntrack


安装containerd[all nodes]

创建 /etc/modules-load.d/containerd.conf 配置文件

cat << EOF > /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

modprobe overlay
modprobe br_netfilter

配置源文件

获取阿里云YUM源
vim /etc/yum.repos.d/docker-ce.repo
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/9/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

yum makecache
下载安装:
yum install -y containerd.io

配置config文件

生成containerd的配置文件
mkdir /etc/containerd -p
生成配置文件
containerd config default > /etc/containerd/config.toml
编辑配置文件
vim /etc/containerd/config.toml
:/SystemdCgroup --true
:/sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"


设置开机启动
systemctl enable containerd
启动服务
systemctl start containerd
查看镜像,验证安装是否成功
ctr images ls

下载K8S

# 把里面的1.31改为1.28即可
https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.73281b11BEAEr6
###阿里云
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/repodata/repomd.xml.key
EOF
yum clean all
yum makecache

yum list kubelet --showduplicates | sort -r | grep 1.28
# 我们这里下载1.28.13
yum -y install kubectl-1.28.13-150500.1.1 kubelet-1.28.13-150500.1.1 kubeadm-1.28.13-150500.1.1

为了实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性,建议修改如下文件内容
vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
设置kubelet为开机自启动即可,由于没有生成配置文件,集群初始化后自动启动
systemctl enable kubelet

下载镜像

准备k8s1.28.13 所需要的镜像
kubeadm config images list --kubernetes-version=v1.28.13
# 拉取镜像
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers 

# 上面的命令是会去下最新的1.28.13的 我们要指定他的k8s版本的
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers  --kubernetes-version=v1.28.13

查看镜像

ctr -n k8s.io image ls

集群初始化【2种方法】

【1】配置文件

# 这里要做个快照镜像
kubeadm config print init-defaults > kubeadm_init.yaml
生成 init 初始化配置文件
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.0.21  # 主节点IP
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock  # 底层走的什么容器
  imagePullPolicy: IfNotPresent
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers  # 镜像仓库
kind: ClusterConfiguration
kubernetesVersion: 1.28.13  # k8s版本
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12  # svc网段
  podSubnet: 10.244.0.0/16   # pod 网段
scheduler: {}

kubeadm init --config ./kubeadm_init.yaml

【2】命令行

kubeadm init --kubernetes-version=v1.28.13 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --service-dns-domain=cluster.local --apiserver-advertise-address=192.168.0.21 --image-repository registry.aliyuncs.com/google_containers

实验过程中存在新问题记录

分析:以往的kubeadm安装出现的问题为 初始化的时候会卡在kubelet上
原因为: kubelet 状态为 auto-restart 自动重启,缺失init初始化的文件导致无法正常启动
第一次遇到这个问题的解决方式为: 
先执行 kubeadm init 集群初始化生成文件后  kubeadm reset
# 再进行kubelet的重启 
systemctl restart kubelet
# 再执行集群初始化操作 
kubeadm init --kubernetes-version=v1.28.13 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --service-dns-domain=cluster.local --apiserver-advertise-address=192.168.0.21 --image-repository registry.aliyuncs.com/google_containers
以往的操作在做kubeadm实验中都是可行的
但是这是不规范的,以往我们做的实验都是做的最新的k8s集群版本,所以不会出现这个问题 
你直接执行kubeadm init 默认就是用的最新的版本,所以我一直没有遇到这个情况

本次实验出现了上图问题 卡在了 kubeadm config images pull 上
这个的问题为 镜像没有下载到位,kubeadm init 初始化集群会通过内置去拉取镜像,而不是通过底层容器
docker 或者 containerd 去找现有镜像,通过内置拉取镜像不走镜像源,服务器在国内,而有些镜像在
国外,如 quay.io  k8s.gcr.io gcr.io 等前缀的镜像,所以会出现超时,拉取镜像失败的情况
其实就是 kubeadm init这个操作没有指定对应的k8s版本,镜像仓库 导致init默认kubeadm init 命令默认情况下会去找最新的 Kubernetes 版本。如果你想使用特定版本,你可以通过 --kubernetes-version 参数指定版本号。
这也是我们之前做实验遗留下来的问题导致的,所以这次出错的原因本质为 : kubeadm init 执行后
init内置拉取k8s1.32.0版本镜像,那必然是拉不下来的
也没有设置1.32.0的仓库,也没有1.32.0的镜像 所以出现了上面的问题
所以 以后做不是最新的版本的 最好把命令敲全或者使用配置文件进行初始化
记录init中需要涉及到的日志查询
tail /var/log/messages
journalctl -xeu kubelet

工作节点加入

kubeadm join 192.168.0.21:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:df83f2a3684f4fdff8894a595a270d859052276601ddc905d570d904859cf9da

实验环境
系统:rocky9.5 沿用之前的实验集群环境
把calico直接下掉即可

分两种
1、pod  node  svc 三种分开的
2、 三种在一起的

一般是业务要求很高的情况下使用Underlay  不经过svc
underlay网络和overlay网络 最好是拆分开 可以分摊网络压力 
overlay 压力相对较大一些  underlay网络只需要路由
一个网段的建议画 /8的 地址范围大 
或者 两套集群
一套Underlay 一套overlay  通过k8s config文件 拉到一起去
通过 kramada 联邦管理 这两套集群

或者有多持久化的需求,有状态服务,数据库等,可以使用underlay网络,可以减少网络宽带
如无状态服务 nginx 
任务: metellb + ingress 内部负载均衡 
显示: zadig
网络  underlay 

使用helm安装 hybridnet

kubeadm 安装的时候需要指定 pod 地址

这个是第一次实验 对比第二次情况

打label

 kubectl label node jichao21 node-role.kubernetes.io/master=
 kubectl label node jichao22 node-role.kubernetes.io/master=
 kubectl label node jichao23 node-role.kubernetes.io/master=

提前拉镜像

镜像:docker.io/hybridnetdev/hybridnet:v0.8.8
ctr -n k8s.io image pull  docker.io/hybridnetdev/hybridnet:v0.8.8
helm install hybridnet hybridnet/hybridnet -n kube-system --set init.cidr=10.244.0.0/16 --version 0.6.8 
helm repo add hybridnet https://alibaba.github.io/hybridnet/
helm repo update

##配置overlay pod网络(使用kubeadm初始化时指定的pod网络),如果不指定--set init.cidr
就会默认使用100.64.0.0/16

helm install hybridnet hybridnet/hybridnet -n kube-system --set init.cidr=10.244.0.0/16
不确定自己的网络 就看一下pod的ip


underlay网络 就是物理机的IP地址段

创造underlay网络并与node关联

mkdir hybridnet
cd hybridnet/
kubectl label node jichao21 network=underlay-nethost
kubectl label node jichao22 network=underlay-nethost
kubectl label node jichao23 network=underlay-nethost

underlay 网络


##创建underlay网络
vim 1.create-underlay-network.yaml
---
apiVersion: networking.alibaba.com/v1
kind: Network
metadata:
  name: underlay-network1
spec:
  netID: 0
  type: Underlay
  nodeSelector:
    network: "underlay-nethost"
---
apiVersion: networking.alibaba.com/v1
kind: Subnet
metadata:
  name: underlay-network1
spec:
  network: underlay-network1
  netID: 0
  range:
    version: "4"
    cidr: "192.168.0.0/24" # 物理网段 可以用 route -n 看
    gateway: "192.168.0.2" # 外部网关地址
    start: "192.168.0.70"
    end: "192.168.0.254"
---
kubectl apply -f 1.create-underlay-network.yaml
kubectl get network
# 创建了一个underlay网段,这个时候pod应该都用我们定义的网段了
# 创建一个Pod看看具体什么情况

overlay 测试

# 测试pod
# 创建namespace
kubectl create ns myserver

# 这里测试用的overlay 你可以发现他的ip地址段为10.244.0.0
vim 2.tomcat-app1-overlay.yaml
---
kind: Deployment
apiVersion: apps/v1
metadata:
  labels:
    app: myserver-tomcat-app1-deployment-overlay-label
  name: myserver-tomcat-app1-deployment-overlay
  namespace: myserver
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myserver-tomcat-app1-overlay-selector
  template:
    metadata:
      labels:
        app: myserver-tomcat-app1-overlay-selector
    spec:
      nodeName: jichao22
      containers:
      - name: myserver-tomcat-app1-container
        #image: tomcat:7.0.93-alpine
        image: registry.cn-hangzhou.aliyuncs.com/zhangshijie/tomcat-app1:v1
        imagePullPolicy: IfNotPresent
        ##imagePullPolicy: Always
        ports:
        - containerPort: 8080
          protocol: TCP
          name: http
        env:
        - name: "password"
          value: "123456"
        - name: "age"
          value: "18"
#         resources:
#           limits:
#             cpu: 0.5
#             memory: "512Mi"
#           requests:
#             cpu: 0.5
#             memory: "512Mi"

---
kind: Service
apiVersion: v1
metadata:
  labels:
    app: myserver-tomcat-app1-service-overlay-label
  name: myserver-tomcat-app1-service-overlay
  namespace: myserver
spec:
  type: NodePort
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 8080
    nodePort: 30003
  selector:
    app: myserver-tomcat-app1-overlay-selector
---

kubectl create ns myserver
kubectl apply -f 2.tomcat-app1-overlay.yaml

# 测试 直接curl pod的ip地址段 能否访问
kubectl get po -A -o wide
curl http://10.244.0.3:8080/myapp/index.html
# 也可以测试下svc端口 使用物理网卡测试能不能行

curl http://192.168.0.23:30003/myapp/index.html
curl http://192.168.0.22:30003/myapp/index.html


# 这就是overlay网络

underlay pod测试

使用underlay的网络
vim 3.tomcat-app1-underlay.yaml
---
kind: Deployment
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
metadata:
  labels:
    app: myserver-tomcat-app1-deployment-underlay-label
  name: myserver-tomcat-app1-deployment-underlay
  namespace: myserver
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myserver-tomcat-app1-underlay-selector
  template:
    metadata:
      labels:
        app: myserver-tomcat-app1-underlay-selector
      annotations: #使用Underlay或者Overlay网络
        networking.alibaba.com/network-type: Underlay
    spec:
      #nodeName: k8s-node2.example.com
      containers:
      - name: myserver-tomcat-app1-container
        #image: tomcat:7.0.93-alpine
        image: registry.cn-hangzhou.aliyuncs.com/zhangshijie/tomcat-app1:v2
        imagePullPolicy: IfNotPresent
        ##imagePullPolicy: Always
        ports:
        - containerPort: 8080
          protocol: TCP
          name: http
        env:
        - name: "password"
          value: "123456"
        - name: "age"
          value: "18"
#       resources:
#         limits:
#           cpu: 0.5
#           memory: "512Mi"
#         requests:
#           cpu: 0.5
#           memory: "512Mi"
---
kind: Service
apiVersion: v1
metadata:
  labels:
    app: myserver-tomcat-app1-service-underlay-label
  name: myserver-tomcat-app1-service-underlay
  namespace: myserver
spec:
#  type: NodePort
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 8080
    #nodePort: 40003
  selector:
    app: myserver-tomcat-app1-underlay-selector

kubectl apply -f 3.tomcat-app1-underlay.yaml

添加路由


同样在cmd控制台也是通的
浏览器访问也是通的
但是 svc不行
哪台机器访问就增加哪条路由

route add -net 10.108.55.0 netmask 255.255.255.0 gateway 192.168.0.21
curl http://10.108.55.139/myapp/index.html

自主pod

自主式pod测试
# 建立提前拉取镜像
ctr -n k8s.io images pull docker.io/library/nginx:1.7.9
vim 4.pod-underlay.yaml

apiVersion: v1
kind: Pod
metadata:
  name: annotations-demo
  annotations:
    networking.alibaba.com/network-type: Underlay
spec:
  containers:
  - name: nginx
    image: nginx:1.7.9
    ports:
    - containerPort: 80

 kubectl apply -f 4.pod-underlay.yaml


kubectl get po -o wide
# 你会发现这个pod的地址就是underlay 物理地址
curl http://192.168.0.75
自主pod删除就没有数据了
你可以在cmd中测试 也可以直接通过浏览器访问这个pod的ip

第二次实验

kubeadm init 的时候需要指定它的pod svc地址段
svc 由10.96.0.0 换成了物理网段
route -n 具体可以查到
这个实验和上面的操作差不多 只是指明了svc的网络地址段

metellb[underlay模式不用]

提前准备好镜像,没有的可以通过链接下载

安装ingress-controller

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.12.0-beta.0/deploy/static/provider/cloud/deploy.yaml
vim deploy.yaml
:?controller:v1.12.0
registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.12.0-beta.0
:?kube-webhook-certgen
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.4.4
mv  deploy.yaml  ingress-nginx-1.12.yaml
kubectl apply -f ingress-nginx-1.12.yaml
kubectl get pod -n ingress-nginx
kubectl get svc -n ingress-nginx

安装metallb

kubectl edit cm -n kube-system kube-proxy
:?mode --- ipvs
:?strictARP true
# 重启Kube-proxy
kubectl rollout restart daemonset kube-proxy -n kube-system

wget https://raw.githubusercontent.com/metallb/metallb/v0.14.8/config/manifests/metallb-native.yaml
kubectl apply -f metallb-native.yaml
这边可能出现无法拉取镜像的情况
ctr image pull quay.io/metallb/speaker:v0.14.8
kubectl get po -n metallb-system -o wide

安装地址池和二层应用

kubectl apply -f L2.yaml IPAddressPool.yaml
kubectl get svc -n ingress-nginx

测试

kubectl create deployment demo --image=httpd --port=80
kubectl expose deployment demo
kubectl create ingress demo-localhost --class=nginx \
 --rule="demo.localdev.me/*=demo:80"



 ## 在hosts解析里面增加对应的域名和Ip
 vim /etc/hosts

 kubectl get ingress

 

测试安装zadig

# # 官方安装网址
https://docs.koderover.com/zadig/Zadig%20v3.2/install/install-on-k8s/#%E6%AD%A5%E9%AA%A4-4-%E9%AA%8C%E8%AF%81%E5%AE%89%E8%A3%85%E7%BB%93%E6%9E%9C
# zadig 暴露方式有两种
1 如果选择 IP+端口 的方式访问 Zadig 系统,需要确保集群节点有外部 IP 可供访问
2 如果选择域名方式访问 Zadig 系统,需要准备可用的域名,并在安装完成后将流量解析至 gateway-proxy 服务


export IP=192.168.0.21
export PORT=32000
curl -SsL https://download.koderover.com/install?type=quickstart | bash

# 这一步属于是更新操作
通过命令 helm get values -n zadig zadig-zadig  > zadig.yaml 备份当前的安装参数

helm repo add koderover-chart https://koderover.tencentcloudcr.com/chartrepo/chart
helm repo update
helm upgrade zadig-zadig -n zadig --version=3.2.0 koderover-chart/zadig -f zadig.yaml