1. golang程序
golang程序实现了一个简单的hello world接口,代码如下:
package main
import (
"log"
"net/http"
)
func main() {
http.HandleFunc("/v1/test/helloword", hello)
server := http.Server{
Addr: ":8081",
}
err := server.ListenAndServe()
if err != nil {
panic(err)
}
}
func hello(response http.ResponseWriter, request *http.Request) {
_, err := response.Write([]byte("{\"msg\":\"hello kubernetes!\"}"))
if err != nil {
log.Println(err)
}
}
运行验证golang程序,接口可成功访问到,golang程序无问题:
2. 容器化
编写Dockerfile,代码如下:
FROM golang:alpine
RUN mkdir /hello-world
COPY . /hello-world
WORKDIR /hello-world
RUN go build -o main .
CMD ["/hello-world/main"]
**编译镜像,**本例直接进入hello-world应用目录使用该目录下Dockerfile进行镜像编译,并将编译镜像命名为hello-world且打上v1.0.0的tag:
查看镜像:
**测试镜像,**运行镜像且将容器端口映射至物理机端口:
访问:
至此说明镜像无问题。
3. 推送镜像到仓库
docker默认镜像仓库为hub.docker。
登录镜像仓库:
将镜像名称重命名为符合docker规范的名称:用户名/镜像名:tag
推送镜像到仓库:
仓库验证:
4. k8s部署
新建namespace(也可不建,用现有的或默认的default),本例采用yaml方式新建ns,yaml如下:
apiVersion: v1
kind: Namespace
metadata:
name: hello-namespace
创建ns并查看ns:
使用deployment部署应用,deployment.yaml如下:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/name: hello-world-app
name: hello-world-app
namespace: hello-namespace
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: hello-world-app
template:
metadata:
labels:
app.kubernetes.io/name: hello-world-app
spec:
containers:
- image: cherishyan/hello-world:v1.0.0
name: hello-world-app
ports:
- containerPort: 8081
创建deployment并查看:
使用service的nodePort方式暴露服务,service.yaml如下:
apiVersion: v1
kind: Service
metadata:
name: hello-world-app-service
namespace: hello-namespace
labels:
k8s-app: hello-world-app-service
spec:
type: NodePort
ports:
- name: hello-world-app-api
port: 8081
targetPort: 8081
nodePort: 31111
selector:
app.kubernetes.io/name: hello-world-app
部署service并查看:
访问node公网ip和映射端口验证:
服务部署成功。