搭建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