K8S安装使用

70 阅读5分钟

分布式部署 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

  1. 安装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
  1. 安装最新版docker
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  1. 使用 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