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

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访问到我们这个服务。

<think>嗯,用户想了解如何在Kubernetes上部署Keycloak并通过NodePort类型的Service暴露访问,而且不使用Secret。我需要先理清楚整个部署的步骤,然后根据要求编写对应的YAML文件。 首先,应该创建一个Deployment来部署Keycloak的Pod。由于用户提到不使用Secret,所以数据库的配置可能需要通过环境变量直接写在Deployment里,或者使用默认的H2数据库。不过Keycloak默认可能已经用了H2,这样可能不需要额外配置数据库,但生产环境不推荐。不过用户可能只是测试,所以暂时不考虑数据库部分,或者假设使用默认配置。 接下来是Service部分,需要指定类型为NodePort,这样可以通过节点的IP端口访问。需要确认端口映射是否正确,比如Keycloak默认使用8080端口,Service应该将targetPort设为8080,并暴露一个NodePort,可能由系统分配或者手动指定。 然后,要注意环境变量的设置,比如Keycloak的管理员用户名密码,通常这些会通过Secret传递,但用户要求不使用Secret,所以需要直接在Deployment的环境变量中明文设置,比如KEYCLOAK_ADMINKEYCLOAK_ADMIN_PASSWORD。这样虽然不安全,但符合用户的需求。 另外,可能需要设置其他环境变量,比如开启生产模式,或者配置代理,因为如果运行Kubernetes后面,可能需要设置代理相关的参数,如KEYCLOAK_PROXY=edge。但用户可能只需要基础的访问,这部分可以暂时省略,或者简单提及。 然后,将这些配置整合到YAML文件中。需要确保语法正确,比如apiVersion是否正确,标签是否匹配,容器镜像的版本是否合适。Keycloak的镜像可能使用quay.io/keycloak/keycloak:latest,但最好指定具体版本,比如21.0.0,避免latest带来的变动。 最后,Service的YAML部分要正确关联到Deployment的标签,端口映射正确,nodePort如果指定的话要在30000-32767之间,或者留空让Kubernetes自动分配。 可能还需要考虑健康检查,比如就绪存活探针,确保Pod正确启动。这部分可以添加到Deployment中,使用Keycloak的管理接口的健康检查端点。 总结一下,步骤是: 1. 创建Deployment,配置环境变量直接设置管理员账号密码,不使用Secret。 2. 创建NodePort类型的Service,暴露8080端口。 3. 确保YAML语法正确,包括缩进、标签匹配等。 需要检查是否有遗漏的部分,比如是否需要持久化存储,但用户可能不需要,所以可以忽略,或者提醒用户生产环境需要考虑。 然后编写YAML文件,分别写出DeploymentService的配置,并解释各部分的作用,确保用户能够理解每个部分的意义,以及如何访问服务。 最后提醒用户安全风险,比如明文密码NodePort的公开访问可能带来的问题,建议生产环境中使用其他方法,比如IngressSecret,但根据用户要求,当前不涉及这些。</think>以下是使用Kubernetes部署Keycloak并通过NodePort访问的YAML配置(不使用Secret): ```yaml # keycloak-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: keycloak labels: app: keycloak spec: replicas: 1 selector: matchLabels: app: keycloak template: metadata: labels: app: keycloak spec: containers: - name: keycloak image: quay.io/keycloak/keycloak:21.0.0 args: ["start-dev"] env: - name: KEYCLOAK_ADMIN value: "admin" # 明文设置管理员账号 - name: KEYCLOAK_ADMIN_PASSWORD value: "admin" # 明文设置管理员密码 ports: - containerPort: 8080 readinessProbe: httpGet: path: /realms/master port: 8080 initialDelaySeconds: 30 periodSeconds: 10 --- # keycloak-service.yaml apiVersion: v1 kind: Service metadata: name: keycloak spec: type: NodePort selector: app: keycloak ports: - name: http port: 8080 targetPort: 8080 nodePort: 30080 # 手动指定NodePort端口(范围30000-32767) ``` 分步说明: 1. **Deployment部分**: - 使用Keycloak官方镜像`quay.io/keycloak/keycloak:21.0.0` - `start-dev`参数启用开发模式(无需数据库配置) - 通过环境变量直接设置管理员凭证(⚠️生产环境不安全) - 设置就绪探针检查`/realms/master`端点 - 暴露容器端口8080 2. **Service部分**: - 设置服务类型为NodePort - 将容器端口8080映射到NodePort 30080 - 使用标签选择器关联Deployment 访问方式: $$http://<NodeIP>:30080$$ - 使用集群任意节点IP + 30080端口访问 - 管理员账号/密码为`admin/admin` 注意事项: 1. 明文存储凭证不安全,仅适用于测试环境 2. NodePort在云环境可能需要额外安全组配置 3. 生产环境建议: - 使用Ingress替代NodePort - 通过Secret管理凭证 - 配置持久化存储 - 启用HTTPS加密 建议测试完成后,参考Keycloak官方文档配置生产环境参数: $$https://www.keycloak.org/server/configuration$$
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值