初次尝试Kubernetes + helm 部署golang应用

1,771 阅读2分钟

0. 前置条件

sudo vim /usr/lib/systemd/system/docker.service
修改这一行,在后面加上-H tcp://0.0.0.0:2375:ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
sudo systemctl daemon-reload
sudo systemctl restart docker

1. 编写golang应用

前端:github.com/chintensaka…
后端:github.com/chintensaka…

image.png Vue + golang开发的docker api可视化小项目,

目前进度:35%,前端UI框架完成,容器列表界面完成;后端gin框架和docker go sdk引入完成,容器列表前后端调用接口完成,启动容器、停止容器前后端完成

先跑起来再说,不必一开始就追求完美。

“我们知道这样不完美并且有问题,但这样可以把事情开展起来,重要的是,不要徘徊在第一次就想把事情做到完美”

2. Dockerfile

# 多阶段构建
FROM golang:alpine AS build-env
WORKDIR /opt/apps/docker-visualizing
COPY . /opt/apps/docker-visualizing

ENV GOOS linux
ENV GOARCH amd64
ENV GOPROXY https://goproxy.cn,direct

RUN go build -v -o /opt/apps/docker-visualizing/app

FROM alpine
COPY --from=build-env  /opt/apps/docker-visualizing/app /usr/local/bin/app
COPY --from=build-env /opt/apps/docker-visualizing/conf/app.ini /usr/local/bin/
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime
EXPOSE 9281
CMD ["app"]
# 构建镜像
docker build -t chins/docker-visualizing .
# 可以查看到已经生成了镜像
docker images 
# 运行容器
docker run -d --name docker-visualizing -p 9281:9281 chins/docker-visualizing

截至这里,使用docker 部署golang(gin)应用已经完成:可以从外部访问docker容器内的gin应用:

docker build: image.png

docker run: image.png

访问: image.png

3. 使用helm部署应用

3.1 创建helm应用模板

helm create docker-visualizing

image.png

3.2 分别编辑deploy、service、ingress(如果用ingress的话)

我这里只使用NodePort来暴露服务,等我学会了ingress再回来优化,并且存活探针和就绪探针现在也不需要,给他注释掉。 找到service.yaml里面的type,可以看到取的值在value.yaml里面:

# service.yaml:
spec:
  type: {{ .Values.service.type }}
  
# values.yaml: 改成NodePort
service:
  type: NodePort
  port: 9281
  
## 改成你自己build的镜像名字
image:
  repository: chins/docker-visualizing

3.3 package && install

# 1. 打包chart包
helm package docker-visualizing

image.png

我这里有两台node节点,镜像是在master上编译的,而我又没有上传到仓库,所以要把master上的镜像拷贝到两台node节点上,否则install的时候,因为node节点本地没有该镜像,所以去仓库拉取镜像会拉取不到:

## master节点:
sudo docker save chins/docker-visualizing:latest -o docker-visualizing.tar
scp docker-visualizing.tar ubuntu@192.168.1.106:/home/ubuntu
scp docker-visualizing.tar ubuntu@192.168.1.251:/home/ubuntu

## node节点:
sudo docker load -i docker-visualizing.tar

image.png

image.png

# 2. 安装chart包
helm install docker-visualizing ./docker-visualizing-0.1.0.tgz

image.png

3. 按照提示操作获取NodePort:
1. Get the application URL by running these commands:
  export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services docker-visualizing)
  export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
  echo http://$NODE_IP:$NODE_PORT

image.png

4. 访问:http://192.168.1.248:30484/ping

image.png

4. 结束。

让应用安装并且运行起来只是第一步,还有很多工作需要去做,比如各种yaml的编写、健康检查、ingress等,还有应用本身代码的优化,有很多变量可以提取到环境变量里面,还有secret/configmap等,有空再尝试。