kubernetes

环境配置·

1
2
3
4
5
6
7
8
9
OS: Kali Linux (on the Windows Subsystem for Linux)
Kernel: x86_64 Linux 6.18.40.1-microsoft-standard-WSL2
Shell: zsh 5.9.2
Resolution: No X Server
WM: Not Found
Disk: 1.4T / 3.9T (37%)
CPU: Intel Core i9-14900HX @ 32x 2.419GHz
GPU: NVIDIA GeForce RTX 4060 Laptop GPU
RAM: 2121MiB / 15851MiB

minikube·

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
curl -LO https://github.com/kubernetes/minikube/releases/latest/download/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
rm minikube-linux-amd64

minikube version
# minikube version: v1.39.0
# commit: 7a9f6a841470a207de8cf4bafcccee0969d8ba10

minikube start --vm-driver docker --container-runtime=docker

minikube status
# minikube
# type: Control Plane
# host: Running
# kubelet: Running
# apiserver: Running
# kubeconfig: Configured

kubectl·

1
2
3
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo chmod +x kubectl
sudo mv kubectl /usr/local/bin/kubectl
命令 作用
kubectl get nodes 查看集群节点
kubectl get pods -A 查看所有命名空间里的 Pod
kubectl get svc -A 查看 Service
kubectl get deploy -A 查看 Deployment
kubectl describe pod POD名称 查看 Pod 详细信息和事件
kubectl logs POD名称 查看容器日志
kubectl get events -A 查看集群事件
kubectl explain deployment 查看资源字段说明

helm·

1
2
3
4
5
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-4
sudo chmod +x get_helm.sh
./get_helm.sh

helm version

minikube 部署·

1
2
3
4
5
6
7
8
9
10
11
12
13
minikube delete -p minikube
minikube start \
--driver=docker \
--container-runtime=containerd \
--cpus=2 \
--memory=4096

minikube profile list
# ┌──────────┬────────┬────────────┬──────────────┬─────────┬────────┬───────┬────────────────┬────────────────────┐
# │ PROFILE │ DRIVER │ RUNTIME │ IP │ VERSION │ STATUS │ NODES │ ACTIVE PROFILE │ ACTIVE KUBECONTEXT │
# ├──────────┼────────┼────────────┼──────────────┼─────────┼────────┼───────┼────────────────┼────────────────────┤
# │ minikube │ docker │ containerd │ 192.168.49.2 │ v1.37.0 │ OK │ 1 │ * │ * │
# └──────────┴────────┴────────────┴──────────────┴─────────┴────────┴───────┴────────────────┴────────────────────┘

运行下面指令发现

1
2
3
4
5
6
7
8
9
10
kubectl get pods -n kube-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
coredns-559f6c778d-v8kc8 1/1 Running 0 57s 10.244.0.2 minikube <none> <none>
etcd-minikube 1/1 Running 0 63s 192.168.49.2 minikube <none> <none>
kindnet-gvv4t 1/1 Running 0 57s 192.168.49.2 minikube <none> <none>
kube-apiserver-minikube 1/1 Running 0 63s 192.168.49.2 minikube <none> <none>
kube-controller-manager-minikube 1/1 Running 0 63s 192.168.49.2 minikube <none> <none>
kube-proxy-8p8x8 1/1 Running 0 57s 192.168.49.2 minikube <none> <none>
kube-scheduler-minikube 1/1 Running 0 63s 192.168.49.2 minikube <none> <none>
storage-provisioner 1/1 Running 0 62s 192.168.49.2 minikube <none> <none>
Pod 名称 组件 主要作用
coredns-559f6c778d-v8kc8 CoreDNS 集群内部 DNS 服务,负责 Service 域名解析
etcd-minikube etcd Kubernetes 的数据库,保存集群状态和配置
kindnet-gvv4t kindnet CNI 网络组件,负责 Pod 网络连通性
kube-apiserver-minikube API Server Kubernetes API 入口,处理所有集群管理请求
kube-controller-manager-minikube Controller Manager 控制器管理器,确保集群实际状态逐渐达到期望状态
kube-proxy-8p8x8 kube-proxy 实现 Service 到后端 Pod 的网络转发
kube-scheduler-minikube Scheduler 调度器,决定新 Pod 应该运行在哪个 Node 上
storage-provisioner Storage Provisioner 为 PVC 动态创建本地持久化存储

在本地 Kubernetes 集群中运行 Nginx,创建多个副本,并从 Windows 浏览器访问它

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mkdir -p k8s-lab
cd k8s-lab
vim nginx.yaml # 见附录

# 下面部署 Nginx
kubectl apply -f nginx.yaml
# namespace/lab created
# deployment.apps/web created
# service/web created

kubectl -n lab get deployments
kubectl -n lab get pods -o wide
kubectl -n lab get services

# 等待应用就绪
kubectl -n lab rollout status deployment/web

# 浏览器访问
minikube service web -n lab --url # http://127.0.0.1: XXXXX

创建完成后

1
2
3
4
5
6
7
Kubernetes Cluster
├── default
├── kube-system
└── lab
├── Deployment/web
├── Service/web
└── Pod/...

附录·

  • nginx.yaml:这份文件定义了三个资源:一个 Namespace、一个具有两个副本的 Deployment,以及一个 NodePort 类型的 Service。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

apiVersion: v1
kind: Namespace
metadata:
name: lab
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
namespace: lab
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:stable
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: web
namespace: lab
spec:
type: NodePort
selector:
app: web
ports:
- port: 80
targetPort: 80