k8s入门

简介

docker出现之后使用容器来部署程序的数量大大增加,容器数量越来越多,架构也越来越复杂,如何管理和编排容器就成了一个非常大的问题和挑战

k8s就是为了管理和编排容器而出现的引擎,用于容器的编排管理和扩展

核心组件

节点node:一个节点就是一个服务器或者虚拟机

pod:k8s的最小调度单元,一个或多个容器的组合,pod为其提供了一个共享环境,一般只开一个容器

Service:将一组pod封装成一个服务,应用程序通过service来获取ip访问pod,有点类似于注册中心

Ingress:管理集群外部访问内部服务的入口的,通过ingress来访问内部service

ConfigMap:相当于配置中心,比如数据库配置这样的东西放到里面

Secret:将敏感信息封装起来,会对信息base编码

volume:将持久化存储的资源挂载到磁盘或者远程存储服务上

Deployment:对pod更高的一层抽象

StatefulSet:对有状态的应用程序的高层抽象,比如数据库

image.png

架构

master-worker架构,master负责管理,worker负责工作

kubelet负责管理和维护pod

kube-proxy负责为pod提供网络代理和负载均衡

image.png

master组件

image.png

api server相当于网关,所有请求都先经过api server再继续处理

搭建环境

minikube是一个轻量级的k8s实现,可在本地计算机创建虚拟机,并部署仅包含一个节点的简单集群

kubectl命令行工具与k8s进行交互

在线环境:https://killercoda.com/playgrounds/scenario/kubernetes

我是在wsl里搭配minikube,先启动docker-desktop

然后在wsl里输入

1
2
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

常用命令

kubectl get显示查询出的何种资源

1
2
3
woodq@WoodQ:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 8m51s v1.32.0

运行一个pod

1
2
3
4
5
woodq@WoodQ:~$ kubectl run nginx --image=nginx
pod/nginx created
woodq@WoodQ:~$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 25s

创建一个deployment

1
2
3
4
5
woodq@WoodQ:~$ kubectl create deployment nginx-deployment --image=nginx
deployment.apps/nginx-deployment created
woodq@WoodQ:~$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 1/1 1 1 10s

查看replicaset,pod的副本

1
2
3
➜  ~ kubectl get replicaset
NAME DESIRED CURRENT READY AGE
nginx-deployment-6cfb98644c 1 1 1 4m51s

查看日志

1
➜  ~ kubectl logs nginx

进入交互式容器

1
➜  ~ kubectl exec -it nginx -- /bin/bash

删除命令

1
2
➜  ~ kubectl delete deployment.apps/nginx-deployment
deployment.apps "nginx-deployment" deleted

用yaml命令创建资源

1
2
➜  ~ kubectl create -f nginx-deployment.yaml
deployment.apps/nginx-deployment created
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  GNU nano 7.2  
apiVersion: apps/v1 nginx-deployment.yaml apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80

通过文件创造服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
➜  ~ kubectl create -f nginx-deployment.yaml
deployment.apps/nginx-deployment created
➜ ~ kubectl expose deployment nginx-deployment
service/nginx-deployment exposed
➜ ~ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/nginx 1/1 Running 0 40m
pod/nginx-deployment-55d67f7b54-p6t6h 1/1 Running 0 7s
pod/nginx-deployment-55d67f7b54-skks6 1/1 Running 0 7s
pod/nginx-deployment-55d67f7b54-tqw4f 1/1 Running 0 7s

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 50m
service/nginx-deployment ClusterIP 10.106.168.9 <none> 80/TCP 5s

NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deployment 3/3 3 3 7s

NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deployment-55d67f7b54 3 3 3 7s

详细查看内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
➜  ~ kubectl describe service nginx-deployment
Name: nginx-deployment
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=nginx
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.106.168.9
IPs: 10.106.168.9
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.0.10:80,10.244.0.11:80,10.244.0.12:80
Session Affinity: None
Events: <none>

k8s入门
http://example.com/2025/04/22/k8s入门/
作者
WoodQ
发布于
2025年4月22日
许可协议