在k8s上创建第一个Pod

环境

说明: 其他k8s(例如: k3s, kubernetes)创建Pod的方法和Microk8s没啥区别,可以参考本文

目标

创建一个Nginx的Pod,映射宿主机30000端口到Pod容器的80端口;客户端能通过宿主机30000端口访问Pod容器中的Nginx服务

步骤

从国内源下载nginx:1.27.3镜像, 再导入镜像

Microk8s执行如下命令:

复制代码
microk8s.ctr images pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nginx:1.27.3
microk8s.ctr images tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nginx:1.27.3 docker.io/library/nginx:1.27.3

如果是Kubernetes环境,执行如下命令: (和Microk8s大同小异)

复制代码
ctr -n k8s.io images pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nginx:1.27.3
ctr -n k8s.io images tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nginx:1.27.3 docker.io/library/nginx:1.27.3

创建nginx的namespace

创建一个新的namespace,名称为nginx,后续在这个namespace下创建Pod

复制代码
kubectl create ns nginx

创建并应用deployment

创建nginx-deployment.yaml文件,内容如下:

复制代码
apiVersion: apps/v1
kind: Deployment #指定资源类型
metadata:
  name: nginx-deployment #指定deployment名称
  namespace: nginx #指定pod运行的namespace
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1 # 指定副本数(nginx pod个数)
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.27.3 #(指定镜像)
        imagePullPolicy: IfNotPresent #(指定镜像拉取策略, IfNotPresent表示如果本地有就取本地镜像,否则从网络拉取镜像
        ports:
        - containerPort: 80 # 容器内暴露的端口

这个yaml文件参考了官方文档: https://kubernetes.io/zh-cn/docs/tasks/run-application/run-stateless-application-deployment/

再应用这个deployment

复制代码
kubectl apply -f nginx-deployment.yaml
deployment.apps/nginx-deployment created

deployment创建成功后,查看Nginx pod状态如下:

复制代码
kubectl -n nginx get pods
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-5c7dff4cf7-gbtsr   1/1     Running   0          2m55s

查看当前Nginx deployment的内容

复制代码
kubectl -n nginx get deploy nginx-deployment -o yaml

创建并应用service, 将宿主机端口(例如30000端口)映射到Pod的80端口

创建nginx-service.yaml文件,主要字段的说明参考注释,文件内容如下:

复制代码
apiVersion: v1
kind: Service #指定资源类型
metadata:
  name: nginx-service #指定service的名称
  namespace: nginx #指定pod运行的namespace
spec:
  selector:
    app: nginx
  type: NodePort
  ports:
    - protocol: TCP
      targetPort: 80 # Pod容器中的端口,是Nginx程序实际监听的端口
      port: 80 # 暴露在cluster IP上的端口,提供集群内部访问service的入口, 即clusterIP:port
      nodePort: 30000 # 指定宿主机的端口, nodePort提供集群外部访问Service的能力

面试题: 说说看Service中port, targetPort, nodePort的作用,有什么区别?

  • port: 暴露在cluster IP上的端口,提供集群内部访问service的入口,即clusterIP:port
  • nodePort: 宿主机端口, 提供集群外部访问Service的能力
  • targetPort: Pod内部端口,是实际应用程序监听的端口

再应用这个service

复制代码
kubectl apply -f nginx-service.yaml
service/nginx-service created

执行成功后,查看service

复制代码
kubectl -n nginx get svc
NAME            TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
nginx-service   NodePort   10.152.183.248   <none>        80:30000/TCP   2m32s

可以看出NodePort端口是30000,clusterIp:port为10.152.183.248:80

测试

通过NodePort方式可以访问Nginx

复制代码
curl localhost:30000
...
<title>Welcome to nginx!</title>
...

通过clusterIp:port方式也可以访问Nginx

复制代码
curl 10.152.183.248:80
...
<title>Welcome to nginx!</title>
...

删除Nginx Pod

删除之前创建的deployment和service资源即可,方法如下:

复制代码
kubectl -n nginx delete deploy nginx-deployment
kubectl -n nginx delete svc nginx-service

参考

https://kubernetes.io/zh-cn/docs/tasks/run-application/run-stateless-application-deployment/

相关推荐
有个傻瓜5 小时前
PHP语言核心技术全景解析
开发语言·kubernetes·php
幻灭行度5 小时前
CKA考试知识点分享(2)---ingress
kubernetes
MickeyCV14 小时前
使用Docker部署MySQL&Redis容器与常见命令
redis·mysql·docker·容器·wsl·镜像
藥瓿亭16 小时前
K8S认证|CKS题库+答案| 6. 创建 Secret
运维·ubuntu·docker·云原生·容器·kubernetes·cks
2302_8097983216 小时前
【JavaWeb】Docker项目部署
java·运维·后端·青少年编程·docker·容器
嵌入式大圣16 小时前
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
运维·docker·容器
孔令飞16 小时前
Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践
ai·云原生·容器·golang·kubernetes
极简网络科技18 小时前
Docker、Wsl 打包迁移环境
运维·docker·容器
江湖有缘18 小时前
【Docker管理工具】部署Docker可视化管理面板Dpanel
运维·docker·容器
猫咪老师199520 小时前
多系统一键打包docker compose下所有镜像并且使用
java·docker·容器