1.k8s-环境搭建

1. docker安装 换源

apt install docker.io

镜像加速

vim /etc/docker/daemon.json
 # 在文件中写入
 {
 "registry-mirrors": [
 "https://dockerhub.azk8s.cn",
 "https://reg-mirror.qiniu.com",
 "https://registry.docker-cn.com",
 "http://hub-mirror.c.163.com",
 "https://3laho3y3.mirror.aliyuncs.com",
 "http://f1361db2.m.daocloud.io",
 "https://mirror.ccs.tencentyun.com"
 ]
 }
# 重启服务
sudo systemctl daemon-reload
sudo systemctl restart docker

docker设置

# 检查 Docker 服务的状态
sudo systemctl status docker
# 启动 Docker
sudo systemctl start docker
# 设置 Docker 开机自启
sudo systemctl enable docker

2. 安装 kubectl

curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

3. Kind 部署实验级集群

3.1. 下载 Kind

wget https://github.com/kubernetes-sigs/kind/releases/download/v0.27.0/kind-linux-amd64
chmod +x kind-linux-amd64
sudo mv kind-linux-amd64 /usr/local/bin/kind
kind version

3.2. 常用命令

# 获取集群列表, Kind可以在一个主机上创建多个集群
kind get clusters
# 切换集群demo2,这里名字容易错,是 kind-集群名
kubectl config use-context kind-demo2
# 删除集群
kind delete cluster --name demo

3.3. 创建集群

3.3.1. 1master 2worker(v1.23)

config.yaml

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: demo
nodes:
 - role: control-plane
 - role: worker
 - role: worker

执行命令

docker pull kindest/node:v1.23.4
kind create cluster --config config.yaml --image kindest/node:v1.23.4

注:创建的集群是默认绑定到127.0.0.1地址上的。此时外部是无法访问到集群内部的资源的

Pasted image 20250408212751

3.3.2. 1master 1worker 开放监听(v1.23)

刚刚我们创建的那个是无法访问的,这个是可以访问到集群服务的
删除之前的集群 kind delete cluster --name demo
config.yaml

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: demo
nodes:
  - role: control-plane
    image: kindest/node:v1.23.4
    extraPortMappings:  # 将容器内的 Kubernetes API Server 端口(6443)映射到宿主机的 26443 端口
      - containerPort: 6443  # 容器内部端口
        hostPort: 26443      # 宿主机映射端口
        listenAddress: "0.0.0.0"  # 监听所有网络接口
  - role: worker
    image: kindest/node:v1.23.4

通过 extraPortMappings 将容器中的 6443 端口映射到本机的 26443 端口,这意味着本机上的所有地址都可以通过访问本机的 26443 端口与 Kind 集群中的 6443 服务进行交互。

此时我们可以尝试去访问一下我们的kind集群
Pasted image 20250408214649
这里因为我们没有任何权限,也没有凭证所以这里报错403

创建knd集群

kind create cluster --config config.yaml

3.4. 将本机镜像导入到 Kind 集群

Kind 集群中的 Docker 镜像可以从互联网直接拉取,有时候可能比较缓慢,我们可以将本机镜像导入到Kind 集群中去。当有时候你创建集群的时候也很慢的话,也可以这个方法导入 node 的镜像

3.4.1. 导入 alpine 镜像

docker pull alpine

#向 demo 集群的所有节点导入镜像
kind load docker-image --name demo alpine:latest

#向指定的 node 导入镜像
kind load docker-image --name demo --nodes demo-worker,demo-worker2 alpine:latest

#进入某一个节点查看镜像导入情况
docker exec -it demo-worker /bin/bash
ctr -n k8s.io i ls -q |grep alpine

#删除某镜像
ctr -n k8s.io i rm xxxx

使用该镜像创建 Pod 示例

apiVersion: v1  
kind: Pod  
metadata:  
 name: alpine  
spec:
 containers:  
 - args:  
   - alpine  
   image: docker.io/library/alpine:latest
    # imagePullPolicy: IfNotPresent
   name: pod  
   command:
     - "sleep"
     - "infinity"

注:如果用配置文件的方法创建 Pod 还是拉取镜像不成功,修改容器镜像拉取配置 imagePullPolicy: IfNotPresent 表示如果镜像已经存在于本地,则将使用本地的镜像而不进行拉取
或者可以用命令行 kubectl run alpine --image=docker.io/library/alpine:latest --restart=Never --overrides='{"apiVersion":"v1","spec":{"containers":[{"name":"pod","command":["sleep","infinity"],"image":"docker.io/library/alpine:latest","securityContext":{"readOnlyRootFilesystem":true}}]}}'

3.4.2. 导入节点镜像

docker pull kindest/node:v1.23.4

4. K3S 部署集群

4.1. 实验环境

两台 ubuntu22.04 虚拟机,一台做 master,一台做 worker,两台虚拟机之间通信正常,都安装好Docker。

4.2. 安装 K3S

4.2.1. 部署 1master 1worker 集群(v1.23)

一键在机器 master 上安装 master 节点

#安装k3s
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -

#创建master节点
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.23.15+k3s1 bash -s - server \
  --system-default-registry "registry.cn-hangzhou.aliyuncs.com" \
  --write-kubeconfig ~/.kube/config \
  --write-kubeconfig-mode 666 \
  --disable traefik \
  --bind-address 0.0.0.0
Tip

如果报错找不到“assets/Pasted image 20250413171905.png”。
执行下面的命令

# 复制 k3s 的 kubeconfig 到默认位置
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $USER:$USER ~/.kube/config

# 修改 server 地址为 127.0.0.1(证书默认包含的地址)
sed -i 's/server: .*/server: https:\/\/127.0.0.1:6443/' ~/.kube/config

# 验证连接
kubectl get nodes

弄好后的样子
Pasted image 20250408224409
其他的一些设置

# 配置 containerd 的 mirror
cat > /etc/rancher/k3s/registries.yaml <<EOF
mirrors:
  docker.io:
    endpoint:
      - "http://hub-mirror.c.163.com"
      - "https://docker.mirrors.ustc.edu.cn"
      - "https://registry.docker-cn.com"
EOF
systemctl restart k3s
# 开机自启
systemctl enable k3s --now
# 启动服务
systemctl start k3s  
systemctl status k3s

查看 master 节点的 ip
kubectl get nodes -o wide

获取 master 节点的 token
cat /var/lib/rancher/k3s/server/node-token
Pasted image 20250408224613

4.2.2. 机器 worker1 上安装 worker 节点

apt update
apt install policycoreutils
#K3S_URL替换成实际的master节点IP
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_VERSION="v1.23.15+k3s1" K3S_KUBECONFIG_OUTPUT=~/.kube/config INSTALL_K3S_MIRROR=cn K3S_URL="https://192.168.8.37:6443" K3S_TOKEN="K1036dd97f92311ac0373a033b2633387db796b6f7ab9b54a8d38528bd75a0f46e3::server:16bd37a4f280024da4daed48263a0b09" sh -

curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
K3S_URL=https://192.168.8.37:6443 \
K3S_TOKEN=K1036dd97f92311ac0373a033b2633387db796b6f7ab9b54a8d38528bd75a0f46e3::server:16bd37a4f280024da4daed48263a0b09 \
bash -s - agent

Pasted image 20250413165202.png

Warning

如果执行 get pod报错显示 Get "http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused"
大概率是配置问题。把k3s server机器中的/etc/rancher/k3s/k3s.yaml 复制一份到agent 的~/.kube/config 并修改一下server 字段为对应的serverIP

弄好后的样子
Pasted image 20250408233317

其他的一些设置

// 开机自启
systemctl daemon-reload
systemctl enable k3s-agent
// 启动服务
systemctl start k3s-agent
systemctl status k3s-agent
// 重启服务
systemctl restart k3s-agent
// agent 查看配置信息,可以进行修改
vim /etc/systemd/system/k3s-agent.service.env

4.3. 卸载 K3S

# 一键卸载 server
k3s-uninstall.sh
# 一键卸载 agent
k3s-agent-uninstall.sh

5. Kind 特点

Kind 是 Kubernetes in Docker 的简写,是一个使用 Docker 容器作为 Node 节点,使用 Containerd 作为容器运行时,在本地创建和运行Kubernetes 集群的工具,解决了在本机运行多个 Node 的问题。适用于在本机创建 Kubernetes 集群环境进行开发和测试,使用 Kind 搭建的集群无法在生产中使用。
使用容器运行时,Kind 使用 Docker。
运行在Docker容器中,资源消耗较大,不适合生产环境
Pasted image 20250408233517

6. K3s 特点

K3s 是 Kubernetes 的缩小版本,是可以在生产上使用的,更适用于小规模集群通过删除可有可无的功能和使用轻量级组件(例如 sqlite3 而不是 etcd3),软件实现了显着的体积缩减,K3s 将所有 Kubernetes 组件打包为一个单一的二进制文件,简化了安装和管理。使用容器运行时,但 K3s 默认使用 containerd。

通过精简组件(如用SQLite替代etcd)和优化架构,将Kubernetes打包成单个二进制文件。它专为资源受限场景设计,比如边缘计算、IoT设备或小型生产集群,具有极低的资源占用和快速启动的特点