k8s运行自己的服务流程,以及yaml文件中的port,targetport,nodeport含义和用法

k8s yaml文件中的port,targetport,nodeport含义和用法

  • 总体流程
  • 打包镜像
  • 编写yaml文件,把服务运行在k8s集群上

总体流程

目前我们已经搭建起来一套k8s集群,有2个master和2个worker,现在编写一个简单的go小程序,可以通过http访问9090端口,go代码如下:

package main

import "github.com/gin-gonic/gin"

func main() {
	r := gin.Default()
	r.GET("/",func(c *gin.Context){
		c.String(200,"index")
	})
	r.GET("/hello",func(c *gin.Context){
		c.String(200,"hello world")
	})
	r.Run(":9090")
}

代码非常简单,使用gin框架搭建的http服务,访问9090端口,url为默认和/hello可以得到两个字符串“index”和“hello world”。
现在想把这个服务以deployment的形式运行在我们的k8s集群上,replicas为2。
大致的思路是编写DockerFile,通过docker把服务打包成镜像,推送到harbor上。然后使用kubectl拉取镜像并运行服务。

打包镜像

需要在linux服务器上配置go环境,这一步网上资源很多,暂不介绍。
代码目录在/home/WebTest下面
在这里插入图片描述
dockerfile内容如下:

FROM golang:1.18-alpine as builder
RUN mkdir /app
ADD . /app
WORKDIR /app
ENV GOPROXY=https://goproxy.cn,direct
RUN go build -o test .
CMD ["/app/test"]

dockerfile中的内容简单介绍一下,首先是以 golang:1.18-alpine为基础镜像,然后创建/app目录,ADD . /app将WebTest下面的代码文件拷贝到app目录下,WORKDIR /app指定命令运行的根目录,ENV GOPROXY=https://goproxy.cn,direct设置了Go环境的代理,防止一些依赖下载过慢,然后就是通过RUN go build -o test .打包服务为二进制文件test,最后运行该文件即可CMD ["/app/test"]
使用docker打包镜像:

docker build -t 10.0.44.37:81/public/hello5:v1 -f /home/WebTest/dockerfile .

打包镜像由于要上传到harbor服务器上,所以镜像命名规则要符合harbor的要求,10.0.44.37:81是harbor服务器的ip和端口号,public是要上传到的harbor项目,可以选择其他的项目例如test;后面跟着的是镜像名字和版本。
k8s运行自己的服务流程,以及yaml文件中的port,targetport,nodeport含义和用法_第1张图片
镜像生成后可以通过docker image查看是否有我们刚刚打包的镜像,如果有的话就可以进行下一步push了:

docker login -u admin -p Harbor12345 10.0.44.37:81
docker push 10.0.44.37:81/public/hello5:v1

是的,上传到harbor需要先通过docker login登录,默认用户密码是admin Harbor12345

编写yaml文件,把服务运行在k8s集群上

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-hello-app
  namespace: my-workspace # 声明工作空间,默认为default
spec:
  replicas: 2
  selector:
    matchLabels:
      name: go-hello-app
  template:
    metadata:
      labels:
        name: go-hello-app
    spec:
      containers:
        - name: go-hello-container
          image: 10.0.44.37:81/public/helloimage:v1
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 9090 # containerPort是声明容器内部的port

---
apiVersion: v1
kind: Service
metadata:
  name: go-hello-app-service
  namespace: my-workspace # 声明工作空间,默认为default
spec:
  type: NodePort
  ports:
    - name: http
      port: 18080 # Service暴露在cluster-ip上的端口,通过:port访问服务,通过此端口集群内的服务可以相互访问
      targetPort: 9090 # Pod的外部访问端口,port和nodePort的数据通过这个端口进入到Pod内部,Pod里面的containers的端口映射到这个端口,提供服务
      nodePort: 31080 # Node节点的端口,:nodePort 是提供给集群外部客户访问service的入口
  selector:
    name: go-hello-app

这里对各种port进行一个说明:
首先是containerPort,它声明了容器内部的port,例如我们这个服务是使用的9090端口,那么这里就要写9090;
port是svc暴露在clusterIP上的端口,它是容器内部访问svc的时候使用的端口号;
targetPort是pod的外部访问端口,这个要和containerPort一致;
nodePort是集群外部访问的端口号,可以通过机器IP+nodePort访问到我们这个服务。

你可能感兴趣的:(kubernetes,docker,linux)