分布式部署 cloud.tencent.com/developer/a…
单节点部署 minikube.kubernetes.ac.cn/docs/start/…
安装虚拟机后固定ip
# 固定IP
network:
ethernets:
ens33:
dhcp4: no
addresses:
- 192.168.154.134/24 # ip地址192.168.xxx.xxx/24,自己根据需要分配最后的IP,
# 此处为100,之后的虚拟机会如101、102等递增,避免冲突
routes:
- to: default
via: 192.168.154.2 # 网关地址192.168.xxx.2
nameservers:
addresses: [114.114.114.114,8.8.8.8] # DNS服务器
version: 2
配置hostname
sudo hostnamectl set-hostname "k8smaster"
sudo hostnamectl set-hostname "k8swork1"
sudo hostnamectl set-hostname "k8swork2"
sudo cat >> /etc/hosts << EOF
192.168.154.134 k8smaster
192.168.154.135 k8swork1
192.168.154.135 k8swork2
EOF
iptable
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
modprobe overlay
modprobe br_netfilter
sudo cat << EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
apt install -y ipset ipvsadm
cat << EOF | sudo tee /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_rr
ip_VS_wrr
ip_vs_sh
nf_conntrack
EOF
cat << EOF | sudo 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
docker
- 安装apt仓库
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
- 安装最新版docker
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
- 使用
docker --version检查
Docker镜像加速
cat << EOF | sudo tee /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://doublezonline.cloud",
"https://dislabaiot.xyz",
"https://docker.fxxk.dedyn.io",
"https://dockerpull.org",
"https://docker.unsee.tech",
"https://hub.rat.dev",
"https://docker.1panel.live",
"https://docker.nastool.de",
"https://docker.zhai.cm",
"https://docker.5z5f.com",
"https://a.ussh.net",
"https://docker.udayun.com",
"https://hub.geekery.cn"
],
"insecure-registries": ["kubernetes-register.sswang.com"],
"exec-opts": [
"native.cgroupdriver=systemd"
]
}
EOF
然后重启
systemctl daemon-reload
systemctl restart docker
设置开机重启
systemctl enable docker
安装cri-docker
为什么需要安装cri-docker?他相当于一个桥梁,k8s通过调用cri-docker来间接调用docker服务 官网安装最新版本,这里为 0.3.16
使用wget(或其他方式)下载到服务器上
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.16/cri-dockerd-0.3.16.amd64.tgz
3.3.1 配置cri-docker
解压
tar xf cri-dockerd-0.3.16.amd64.tgz
解压完成后,其实只有一个文件:cri-dockerd
我们只需要把它移动到 /usr/bin 下即可 移动文件到 /usr/bin 目录
mv cri-dockerd/cri-dockerd /usr/local/bin/
mv cri-dockerd/cri-dockerd /usr/bin/
查看版本号(只为验证)
cri-dockerd --version
设置开机启动脚本,创建文件 /etc/systemd/system/cri-dockerd.service ,写入如下内容(完全复制即可)
k8s1.32版本对应的pause是3.10
记得删除备注 不要多行
# 设置开机启动脚本,创建文件 /etc/systemd/system/cri-dockerd.service ,写入如下内容(完全复制即可)
cat > /etc/systemd/system/cri-dockerd.service<<-EOF
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket
[Service]
Type=notify
ExecStart=/usr/local/bin/cri-dockerd --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.10 --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --cri-dockerd-root-directory=/var/lib/dockershim --docker-endpoint=unix:///var/run/docker.sock --cri-dockerd-root-directory=/var/lib/docker
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
EOF
# 创建 /etc/systemd/system/cri-docker.socket 文件,并写入如下内容
# 下面的 注释一定要拿掉
# 重启 systemctl restart cri-dockerd.service
# 看状态 systemctl status cri-dockerd.service
cat > /etc/systemd/system/cri-docker.socket <<-EOF
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service #systemd cri-docker.servics 文件名
[Socket]
ListenStream=/var/run/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
EOF
# 公共签名密钥(1.32)
# 如果 /etc/apt/keyrings 目录不存在,则应在 curl 命令之前创建它,请阅读下面的注释。
# sudo mkdir -p -m 755 /etc/apt/keyrings
# shell 体验AI代码助手 代码解读复制代码# 三台机器都执行
# 如果 `/etc/apt/keyrings` 目录不存在,则应在 curl 命令之前创建它,请阅读下面的注释。
# sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# 验证
ls /etc/apt/keyrings/
kubernetes-apt-keyring.gpg
# 准备源仓库
# shell 体验AI代码助手 代码解读复制代码# 三台机器都执行
# 此操作会覆盖 /etc/apt/sources.list.d/kubernetes.list 中现存的所有配置。
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 验证 root@k8smaster:~# ls /etc/apt/sources.list.d/
kubernetes.list ubuntu.sources.curtin.orig
ubuntu.sources
# 安装 kubeadm kubectl kubelet是安装k8s的工具。
# 安装默认版本
# 三台机器都执行
sudo apt-get install -y kubelet kubeadm kubectl
为了防止自动更新
# 三台机器都执行
进入文件kubelet,1.30版本之后都是在 /etc/default/kubelet,之前字啊 /etc/sysconfig/kubelet
# 三台机器都执行
vim /etc/default/kubelet
# 三台机器都执行
systemctl enable kubelet
#规划pod/service网段,这两个网段和宿主机网段不能重复!原则只有一个:三个网段不重复,没有交叉即可!
#宿主机网段:前面已经规划过。即:192.168.154.0/24
#service网段:10.96.0.0/12
#pod网段:10.244.0.0/16
# 执行kubeadm来初始化集群,注意不要完全抄如下命令,请自行更改参数值。下面有参数释义。
# k8smaster是主机名称 **注意**
sudo kubeadm init \
--kubernetes-version=1.32.2 \
--control-plane-endpoint=k8smaster \
--apiserver-advertise-address=192.168.154.134 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--image-repository=registry.aliyuncs.com/google_containers \
--cri-socket=unix:///var/run/cri-dockerd.sock \
--upload-certs \
--v=9
# 结果为
kubeadm join k8smaster:6443 --token 330g7a.w0z0o76z2e9um83k \
--discovery-token-ca-cert-hash sha256:b8743c2f42a241c3b039791d82f70f8af40c90c77159eb4f0027cde323e2ea26
# master节点执行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 报错
firewall-cmd --state # 发现正常
systemctl disable firewalld ,重新启动主机
# 其余worker节点执行
sudo kubeadm join k8smaster:6443 --token 330g7a.w0z0o76z2e9um83k \
--discovery-token-ca-cert-hash sha256:b8743c2f42a241c3b039791d82f70f8af40c90c77159eb4f0027cde323e2ea26 \
--cri-socket=unix:///var/run/cri-dockerd.sock \
-v=10
请把命令1在master节点执行。命令2分别在其他的worker节点执行
然后执行 kubectl get nodes命令就可以看到三台机器都在同一个集群了。
root@k8smaster:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8smaster NotReady control-plane 15h v1.32.2
k8snode1 NotReady <none> 15h v1.32.2
k8snode2 NotReady <none> 15h v1.32.2
但是节点都还是NoteReady状态,接下来我们来配置Pod网络,让集群变成Ready状态。需要使用calico组件完成
装calico
请在master上操作
直接copy官网的第一步命令,在master节点上安装
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.29.2/manifests/tigera-operator.yaml
应当先下载里面的配置文件,我们去修改配置文件
# master执行
wget https://raw.githubusercontent.com/projectcalico/calico/v3.29.2/manifests/custom-resources.yaml
# master执行
vim custom-resources.yaml
修改其中的网段为之前规划好的pod网段10.244.0.0/16
运行calico
使用create而不是apply
# master节点执行
kubectl create -f custom-resources.yaml
如果安装过程中由于网络或其他问题,安装失败,想删除资源,可以使用。一般只要是镜像源配置对了就不会失败
# master节点执行
kubectl delete -f custom-resources.yaml
检查calico是否运行成功
执行如下命令,可以看到命名空间 calico-system 下正在运行的容器
kubectl get pod -n calico-system
使用watch命令可以持续监视pod状态
watch kubectl get pod -n calico-system
等待半个小时以上 正常了 running
检验k8s集群
编写资源文件
安装一个nginx服务检验集群的可用性。首先在编写一个~/nginx.yaml资源文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginxweb
annotations:
abc: test
spec:
selector:
matchLabels:
app: nginxweb1
replicas: 2
template:
metadata:
labels:
app: nginxweb1
spec:
containers:
- name: nginxwebc
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginxweb-service
spec:
externalTrafficPolicy: Cluster
selector:
app: nginxweb1
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30180
type: NodePort
运行资源
kubectl create -f nginx.yaml
查看资源状态
查看service状态
# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 15h
nginxweb-service NodePort 10.111.233.14 <none> 80:30180/TCP 15h
查看pod状态
# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginxweb-b6795994c-8267f 1/1 Running 0 16h 10.244.185.199 k8snode2 <none> <none>
nginxweb-b6795994c-9nz5s 1/1 Running 0 16h 10.244.249.2 k8snode1 <none> <none>
访问nginx页面
集群内部网络访问,在任意一台集群机器上执行
curl 10.244.249.2
集群外部访问
通过查看service状态可以看到service的端口映射是30180,你自己机器上可能映射的是其他端口
知道端口后,可以在局域网内的任意一台机器上访问如下链接<ip>:30180
其中ip是虚拟机的任意IP,比如我选择master节点192.168.31.224
访问地址如下
192.168.31.224:30180
安装k8s-dashboard
sudo kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
# 要和k8s的 v1.32版本对应 board 2.7.0
#
# 卸载 kubectl delete -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
# 对外暴露访问端口,由--type=ClusterIP修改为--type=NodePort
sudo kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
# 查看service 记录下来转发端口
kubectl get svc -A|grep dashboard
# 火狐浏览器输入访问地址 其他浏览器需要额外设置:
https://192.168.5.10:31128/,需要token才能访问。
# 创建访问账号
# sudo vim dashboard-token.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
# 创建账号
sudo kubectl apply -f dashboard-token.yaml
获取token 复制到浏览器使用
# sudo kubectl get secret -n kubernetes-dashboard
sudo kubectl -n kubernetes-dashboard create token admin-user