k8s运行自己的服务流程,以及yaml文件中的port,targetport,nodeport含义和用法
k8s port nodeport containerPort
k8s yaml文件中的port,targetport,nodeport含义和用法
总体流程
目前我们已经搭建起来一套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;后面跟着的是镜像名字和版本。
镜像生成后可以通过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上的端口,通过<cluster-ip>:port访问服务,通过此端口集群内的服务可以相互访问
targetPort: 9090 # Pod的外部访问端口,port和nodePort的数据通过这个端口进入到Pod内部,Pod里面的containers的端口映射到这个端口,提供服务
nodePort: 31080 # Node节点的端口,<nodeIP>:nodePort 是提供给集群外部客户访问service的入口
selector:
name: go-hello-app
这里对各种port进行一个说明:
首先是containerPort,它声明了容器内部的port,例如我们这个服务是使用的9090端口,那么这里就要写9090;
port是svc暴露在clusterIP上的端口,它是容器内部访问svc的时候使用的端口号;
targetPort是pod的外部访问端口,这个要和containerPort一致;
nodePort是集群外部访问的端口号,可以通过机器IP+nodePort访问到我们这个服务。
更多推荐
所有评论(0)