1,docker打包镜像
docker build -t demo/user:v1.0.4 .
2,镜像推送到腾讯云docker,腾讯页面有快速部署提示。
docker tag ea3c3a44c58b ccr.ccs.tencentyun.com/demo2023/user:v1.0.4
docker push ccr.ccs.tencentyun.com/demo2023/user:v1.0.4
3,yaml部署k8s。
部署私有docker库的镜像,需要k8s配置secret
|
|
kubectl create secret docker-registry dockerregistrysecret --docker-server=ccr.ccs.tencentyun.com --docker-username=106351 --docker-password=h******* |
https://blog.csdn.net/u010026928/article/details/127229076
4,docker-file(使用本机的git秘钥)
更安全的做法是使用dockerfile环境变量,在docker仓库那里配置。或者在git构建里面配置。
&& echo "${SSH_PRIVATE_KEY}" > ~/.ssh/id_rsa \
https://huoding.com/2021/08/24/944
|
|
FROM golang:1.19 MAINTAINER sanjiaomao@demo.com RUN mkdir /app COPY . /app WORKDIR /app # umask 很关键,没有这个命令,多次没有成功 RUN umask 0077 \ && go env -w GOPROXY=https://goproxy.cn,direct \ && mkdir -p ~/.ssh \ && ssh-keyscan gitlab.com >> ~/.ssh/known_hosts \ && mv /app/id_rsa ~/.ssh/id_rsa \ # 私钥的权限只能是700 \ && chmod -R 700 ~/.ssh/* \ && git config --global url."git@gitlab.com:".insteadOf https://gitlab.com/ RUN go build -o main . CMD ["/app/main"] |
5,部署k8s yaml
user服务:
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 56 57 58 59
|
apiVersion: apps/v1 kind: Deployment metadata: name: user namespace: default # 声明工作空间,默认为default spec: replicas: 2 selector: matchLabels: name: user template: metadata: labels: name: user spec: containers: - name: go-hello-container image: ccr.ccs.tencentyun.com/demo2023/user:v1.0.6 imagePullPolicy: IfNotPresent ports: - containerPort: 8081 # containerPort是声明容器内部的port imagePullSecrets: - name: dockerregistrysecret env: - name: MY_NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName - name: MY_POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: MY_POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: MY_POD_IP valueFrom: fieldRef: fieldPath: status.podIP - name: MY_POD_SERVICE_ACCOUNT valueFrom: fieldRef: fieldPath: spec.serviceAccountName --- apiVersion: v1 kind: Service metadata: name: user-service namespace: default # 声明工作空间,默认为default spec: type: NodePort ports: - name: http port: 18080 # Service暴露在cluster-ip上的端口,通过<cluster-ip>:port访问服务,通过此端口集群内的服务可以相互访问 targetPort: 8080 # Pod的外部访问端口,port和nodePort的数据通过这个端口进入到Pod内部,Pod里面的containers的端口映射到这个端口,提供服务 nodePort: 31080 # Node节点的端口,<nodeIP>:nodePort 是提供给集群外部客户访问service的入口 selector: name: user |
order服务:
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 56 57 58 59
|
apiVersion: apps/v1 kind: Deployment metadata: name: order namespace: default # 声明工作空间,默认为default spec: replicas: 2 selector: matchLabels: name: order template: metadata: labels: name: order spec: containers: - name: go-hello-container image: ccr.ccs.tencentyun.com/demo2023/order:v1.0.1 imagePullPolicy: IfNotPresent ports: - containerPort: 8888 # containerPort是声明容器内部的port imagePullSecrets: - name: dockerregistrysecret env: - name: MY_NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName - name: MY_POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: MY_POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: MY_POD_IP valueFrom: fieldRef: fieldPath: status.podIP - name: MY_POD_SERVICE_ACCOUNT valueFrom: fieldRef: fieldPath: spec.serviceAccountName --- apiVersion: v1 kind: Service metadata: name: order-service namespace: default # 声明工作空间,默认为default spec: type: NodePort ports: - name: http port: 18081 # Service暴露在cluster-ip上的端口,通过<cluster-ip>:port访问服务,通过此端口集群内的服务可以相互访问 targetPort: 8888 # Pod的外部访问端口,port和nodePort的数据通过这个端口进入到Pod内部,Pod里面的containers的端口映射到这个端口,提供服务 nodePort: 31081 # Node节点的端口,<nodeIP>:nodePort 是提供给集群外部客户访问service的入口,就是外网访问接口 selector: name: order |
如果service需要多端口:https://selinux.cn/k8s-yaml-port/
暴露service,使用ingress,先安装一个ingress控制器,在配置一个ingress对象就能生效。
|
|
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.41.2/deploy/static/provider/cloud/deploy.yaml |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: my-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: example.com http: paths: - path: /path1 backend: serviceName: service1 servicePort: 80 - path: /path2 backend: serviceName: service2 servicePort: 80 |
使用官网yaml部署ingress控制器,会自动创建一个新的命名空间,一般不要这么做,为了保持ingress和业务在一个命名空间,要修正一个官网yaml。如果这个service一直不成功部署,需要修改type为nodeport,因为主机并没有安装lb负载均衡。
在这个nginx的ingress对象配置中,可以配置很多项。(以下内容仅供参考)
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
|
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: nginx-web annotations: # 指定 Ingress Controller 的类型 kubernetes.io/ingress.class: "nginx" # 指定我们的 rules 的 path 可以使用正则表达式 nginx.ingress.kubernetes.io/use-regex: "true" # 连接超时时间,默认为 5s nginx.ingress.kubernetes.io/proxy-connect-timeout: "600" # 后端服务器回转数据超时时间,默认为 60s nginx.ingress.kubernetes.io/proxy-send-timeout: "600" # 后端服务器响应超时时间,默认为 60s nginx.ingress.kubernetes.io/proxy-read-timeout: "600" # 客户端上传文件,最大大小,默认为 20m nginx.ingress.kubernetes.io/proxy-body-size: "10m" # URL 重写 nginx.ingress.kubernetes.io/rewrite-target: / spec: # 路由规则 rules: # 主机名,只能是域名,修改为你自己的 - host: k8s.test.com http: paths: - path: backend: # 后台部署的 Service Name,与上面部署的 Tomcat 对应 serviceName: tomcat-http # 后台部署的 Service Port,与上面部署的 Tomcat 对应 servicePort: 8080 |
完成之后,不生效,返回503.网上有人出现过这种错误,没有好的解决。先待续
https://stackoverflow.com/questions/57929675/kubernetes-ingress-controller-returning-503-service-unavailable
无聊可以看一下:https://morningspace.github.io/tech/k8s-net-ingress/#%E9%83%A8%E7%BD%B2ingress-controller
gitlab cicd
在k8s的主节点部署runner,同时把用户权限设置一下
Gitlab-runner设置为docker组的用户
|
|
sudo usermod -aG docker gitlab-runner |
需要在根目录有dockerfile
|
|
FROM golang:1.19 MAINTAINER sanjiaomao@demo.com RUN mkdir /app COPY . /app WORKDIR /app # umask 很关键,没有这个命令,多次没有成功 RUN umask 0077 \ && go env -w GOPROXY=https://goproxy.cn,direct \ && mkdir -p ~/.ssh \ && ssh-keyscan gitlab.com >> ~/.ssh/known_hosts \ && mv /app/id_rsa ~/.ssh/id_rsa \ # 私钥的权限只能是700 \ && chmod -R 700 ~/.ssh/* \ && git config --global url."git@gitlab.com:".insteadOf https://gitlab.com/ RUN go build -o main . CMD ["/app/main"] |
描述一下整体流程:在项目根目录下新增.gitlab-ci.yml文件,提交就能触发cicd。文件内容在runner服务器执行,一般把runner服务器放到一个k8s节点,这样可以直接使用shell控制更新yaml。runner执行docker build,然后把images推送到docker仓库,在用shell更新下shell。
总是超时,暂不深究。
ci配置字段详解:https://meigit.readthedocs.io/en/latest/gitlab_ci_.gitlab-ci.yml_detail.html#id35
end
「三年博客,如果觉得我的文章对您有用,请帮助本站成长」
共有 0 - k8s golang上线