Saki's 研究记录

在Apple M1电脑中通过minikube部署nginx

字数统计: 1.8k阅读时长: 7 min
2023/04/11

环境信息

minikube version: v1.26.0
docker desktop: 4.16.2 (95914)
mac OS: 13.1

表单填写方式部署 nginx

dashboard 的右上角有个+图标,点击后选择从表单创建,填写数据:
应用名称: nginx-form
容器镜像: nginx:latest
pod 的数量: 2
Service: External
端口: 8000, 目标端口: 80, 协议: TCP

nginx
点击部署后,集群将会拉取nginx的最新版本镜像并创建两个 podpod 将内部接口 80 暴露出 8000。应用名为nginx-formdeploymentservice 都会明明为 nginx-form。需要等待几分钟,拉取镜像需要时间。部署成功后,状态将会是running

kubernetes service 是将运行在一个或一组 pod 上的网络应用程序公开为网络服务的方法。
kubernetes deployment 检查 pod 的健康状况,并在 pod 中的容器终止的情况下重新启动新的容器。 deployment 是管理 Pod 创建和扩展的推荐方法。
kubernetes pod 是由一个或多个为了管理和联网而绑定在一起的容器构成的组。

使用 yaml 文件的方式部署 nginx

首先要了解一下yaml语言,因为kubectl需要的通信都是建立在yaml语言之上,和web中的html一样,是所有运行的基础。
编写yaml文档有两个小技巧,一个是参考kubernetes的官方参考文档

另一个是使用
kubectl命令:

1
2
3
4
kubectl explain pod
kubectl explain pod.metadata
kubectl explain pod.spec
kubectl explain pod.spec.containers

使用kubectl例如生成一个模版,输出到一个指定文件中:

1
kubectl run ngx --image=nginx:alpine --dry-run=client -o yaml > nginx_pod.yaml

nginx_pod.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: v1 # 创建该对象所使用的 Kubernetes API 的版本
kind: Pod # 想要创建的对象的类别
# 帮助唯一标识对象的一些数据,包括一个 name 字符串、UID 和可选的 namespace
metadata:
creationTimestamp: null
labels:
run: ngx
name: ngx
# 你所期望的该对象的状态
spec:
containers:
- image: nginx:alpine
name: ngx
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}

pod的关键在于yaml文件的编写,然后用kubectl去执行:

1
2
3
4
5
6
7
8
9
10
11
12
# 添加pod
kubectl apply -f nginx_pod.yaml
# 删除pod
kubectl delete pod [podname]
# 查看pod节点
kubectl get pod -o wide
# 查看日志
kubectl logs [podname]
# 查看pod详细情况
kubectl describe pod [podname]
# 登陆pod
kubectl exec -it ngx-pod -- bash

使用 ConfigMap 配置 Pod

很多应用在其初始化或运行期间要依赖一些配置信息。 大多数时候,存在要调整配置参数所设置的数值的需求。configMapkubernetes的一种机制,可让你将配置数据注入到应用的pod内部。

例如,创建一个ConfigMap来导入时区设置:

1
2
kubectl create configmap area-timezone --from-file=/usr/share/zoneinfo/Asia/Shanghai
configmap/area-timezone created

不创建,以下部署文件执行时会报错: MountVolume.SetUp failed for volume “timezone” : configmap “area-timezone” not found

编辑部署文件

本地编辑一个nginx-deploy.yaml 部署文件。文件中包括 deploymentservice 的资源声明。
nginx-deploy.yaml 部署文件的内容:

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
---
apiVersion: apps/v1 # api 版本
kind: Deployment
metadata:
name: nginx-form # 部署名称
namespace: default # 命名空间
labels:
app: nginx-form
spec:
replicas: 2 # 副本, 告知 Deployment 运行 2 个与该模板匹配的 Pod
selector:
matchLabels:
app: nginx-form # 绑定pod的名称
# pod的模板
template:
metadata:
labels:
app: nginx-form # pod的名称
spec:
containers:
- name: nginx-form # docker容器的名称
image: nginx:latest # docker镜像名
ports:
- containerPort: 80 # 容器的端口
volumeMounts:
#- mountPath: usr/share/nginx/html
#name: share-nginx-html
- mountPath: /etc/localtime
name: timezone
subPath: Shanghai
volumes:
#- name: share-nginx-html
#hostPath:
#path: /Users/shenshijie/Data/app/k8s/ngx/html
#type: DirectoryOrCreate
- name: timezone
configMap:
name: area-timezone # 将 configMap 挂载到 /etc/localtime/Shanghai 目录下

---
apiVersion: v1
kind: Service
metadata:
name: nginx-form
namespace: default
labels:
app: nginx-form
spec:
type: NodePort # 请求可以从外部访问
ports:
- nodePort: 32578 # 外部通过这个端口访问服务(与type为NodePort匹配)
port: 8000 # 集群内部端口
targetPort: 80 # 容器内部端口
selector:
app: nginx-form # 请求转发到 app 为 nginx-with-file 的pod

部署 nginx

根据yaml配置文件创建nginx-form,执行部署命令:

1
kubectl apply -f nginx-deploy.yaml

kubectl apply -f <spec.yaml> - 基于文件名或标准输入,将新的配置应用到资源上

检查容器是否正常运行命令:

1
kubectl get pod

输出类似于:

1
2
3
NAME                          READY   STATUS    RESTARTS   AGE
nginx-form-857bd686db-mchbm 1/1 Running 0 11m
nginx-form-857bd686db-r9tt8 1/1 Running 0 11m

进入容器

除了通过kubectl get pod获取容器信息,还可以通过kubernetes dashboard查看:
k8s-ngx-pods

获取容器详情:

1
kubectl describe pod nginx-form-857bd686db-r9tt8

输出类似于:

1
2
3
4
5
Name:         nginx-form-857bd686db-r9tt8
Namespace: default
...
Containers:
nginx-form:

进入指定容器命令:

1
kubectl exec nginx-form-857bd686db-r9tt8 -c nginx-form -it -- /bin/sh

输出类似于:

1
2
# date
Thu Mar 23 23:51:12 CST 2023

更多exec信息,请移步官方文档

双破折号 “–” 用于将要传递给命令的参数与 kubectl 的参数分开。

显示有关 service 的信息:

1
kubectl get services nginx-form

输出类似于:

1
2
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
nginx-form LoadBalancer 10.98.130.251 <pending> 8000:32578/TCP 8m2s

可以看到 service 对外暴露的端口是 32578,我们通过 minikube 的 IP + 端口即可访问 nginx
查看当前 minikubeIP 地址的命令:

1
2
minikube ip
192.168.49.2

pending
如果外部IP地址显示为<pending>,请等待一分钟再次输入相同的命令。

但因为使用的是minikube,需要输入minikube service nginx-form将在浏览器中自动打开nginx-form应用程序。
成功请求的响应会在浏览器页面展示:

1
minikube service nginx-form

输出类似于:

1
2
3
4
5
6
7
8
9
10
11
12
13
|-----------|------------|------------------------|---------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|------------|------------------------|---------------------------|
| default | nginx-form | tcp-8000-80-j6j9p/8000 | http://192.168.49.2:32578 |
|-----------|------------|------------------------|---------------------------|
🏃 Starting tunnel for service nginx-form.
|-----------|------------|-------------|------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|------------|-------------|------------------------|
| default | nginx-form | | http://127.0.0.1:59206 |
|-----------|------------|-------------|------------------------|
🎉 正通过默认浏览器打开服务 default/nginx-form...
❗ Because you are using a Docker driver on darwin, the terminal needs to be open to run it.

nginx-form-welcome
浏览器自动打开http://127.0.0.1:59206/

显示有关 Service 的详细信息:

1
kubectl describe services nginx-form

输出类似于:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Name:                     nginx-form
Namespace: default
Labels: k8s-app=nginx-form
Annotations: <none>
Selector: k8s-app=nginx-form
Type: LoadBalancer
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.98.130.251
IPs: 10.98.130.251
Port: tcp-8000-80-j6j9p 8000/TCP
TargetPort: 80/TCP
NodePort: tcp-8000-80-j6j9p 32578/TCP
Endpoints: 172.17.0.5:80,172.17.0.6:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>

可以看到服务有几个端点: 172.17.0.5:80,172.17.0.6:80, 这些都是正在运行 nginx-form 应用程序的 Pod 的内部地址。
验证这些是 Pod 地址,请输入以下命令:

1
kubectl get pods --output=wide

输出类似于:

1
2
3
NAME                          READY   STATUS    RESTARTS   AGE   IP           NODE       NOMINATED NODE   READINESS GATES
nginx-form-7cf5c7ddc9-269rs 1/1 Running 0 61m 172.17.0.5 minikube <none> <none>
nginx-form-7cf5c7ddc9-vqxw9 1/1 Running 0 61m 172.17.0.6 minikube <none> <none>

显示有关 Deployment 的信息:

1
2
kubectl get deployments nginx-form
kubectl describe deployments nginx-form

显示有关 ReplicaSet 对象的信息:

1
2
kubectl get replicasets
kubectl describe replicasets

ReplicaSet 的目的是维护一组在任何时候都处于运行状态的 Pod 副本的稳定集合。 因此,它通常用来保证给定数量的、完全相同的 Pod 的可用性。

清理现场

要删除service,请输入以下命令:

1
kubectl delete services nginx-form

要删除正在运行nginx-form应用程序的deploymentreplicaSetpod,请输入以下命令:

1
kubectl delete deployment nginx-form

以上。

CATALOG
  1. 1. 环境信息
  2. 2. 表单填写方式部署 nginx
  3. 3. 使用 yaml 文件的方式部署 nginx
    1. 3.1. 使用 ConfigMap 配置 Pod
    2. 3.2. 编辑部署文件
    3. 3.3. 部署 nginx
    4. 3.4. 进入容器
    5. 3.5. 显示有关 service 的信息:
    6. 3.6. 显示有关 Service 的详细信息:
    7. 3.7. 显示有关 Deployment 的信息:
    8. 3.8. 显示有关 ReplicaSet 对象的信息:
  4. 4. 清理现场