Experimental premise
- You need to have a macOS development environment. This article takes this as an example. Please build other types of development environments by yourself.
- You need to know something about YAML, a language specially used to write configuration files.
- You need to have some basic knowledge of Docker.
- You need to understand some core basic concepts in Kubernetes, such as Node, Pod, ReplicaSet, Deployment, Service, progress, ConfigMap, etc.
YAML profile download address:
- YAML file: jxlwqq/kubernetes-examples . There are other examples of Kubernetes in the project. Welcome, Star.
git clone https://github.com/jxlwqq/kubernetes-examples.git cd deploying-simple-hello-gin-app
Installing Docker for Mac
Download address: hub.docker.com/editions/community/...
Start and open the Kubernetes function. During the function opening process, Docker will automatically pull the Kubernetes related image, so you need to use a special posture to surf the Internet throughout the process.
Why not use minicube? Minicube + VirtualBox + kubectl is too cumbersome to install, and even if you use a special posture to surf the Internet, you may not be able to do it. Of course, Alibaba cloud provided an article Installation tutorial Can refer to.
Local port preparation
Please ensure that port 80 of the local localhost is not occupied. If it is already in use, please temporarily shut down the service occupying port 80 during the experiment.
Switch cluster
If you have multiple Kubernetes cluster configurations locally, please switch to the cluster named docker desktop first:
kubectl config use-context docker-desktop
source code
A simple Gin application looks like this:
package main import "github.com/gin-gonic/gin" func main() { r := gin.Default() r.GET("/hello", func(c *gin.Context) { c.String(200, "Hello, Gin!") }) _ = r.Run(":8080") }
go. The mod file contains the dependencies required by the application:
module hello-gin go 1.16 require github.com/gin-gonic/gin v1.7.2 // indirect
Docker image
The Dockerfile applied is as follows:
# Multi phase construction: improve the construction speed and reduce the image size # Obtain the Go basic image of 1.16 from the official warehouse FROM golang:1.16-alpine AS builder # Set working directory WORKDIR /go/src/hello-gin # Copy project files ADD . /go/src/hello-gin # Download dependency RUN go get -d -v ./... # Build a binary named "app" RUN go build -o app . # Get a lightweight Linux distribution with a size of only about 5M FROM alpine:latest # Copy the binaries built in the previous stage to this stage COPY --from=builder /go/src/hello-gin/app . # Set listening port EXPOSE 8080 # Configure startup command CMD ["./app"]
Build and commit images:
jxlwqq is my Docker Hub account, which needs to be changed to your own account. If you don't have an account, you need to register first: hub.docker.com/signup
If you want to skip this step, you can directly pull the image I made: docker pull jxlwqq / Hello gin: latest
docker build -f Dockerfile -t jxlwqq/hello-gin:latest . # Build mirror docker login # Sign in docker push jxlwqq/hello-gin:latest # Commit mirror
Prerequisite: deploy nginx ingress
In order for the Ingress resource to work, the cluster must have an Ingress controller running. Kubernetes officials currently support and maintain GCE and nginx controllers.
Here we select the ingress nginx controller:
kubectl apply -f ../ingress-nginx/deploy.yaml
Note: deploy Yaml file content comes from: github.com/kubernetes/ingress-ngin...
For detailed operation instructions, see: github.com/kubernetes/ingress-ngin...
Deploy hello gin application
Execute the following command:
kubectl apply -f hello-gin-deployment-and-service.yaml kubectl apply -f ingress.yaml
return:
service/hello-gin-svc created deployment.apps/hello-gin created ingress.networking.k8s.io/hello-gin-ingress created
hello-gin-deployment-and-service.yaml file interpretation:
apiVersion: apps/v1 # api version kind: Deployment # Resource object type metadata: # Deployment metadata name: hello-gin # Object name spec: # Object specification selector: # Selector to select a Pod with the following labels matchLabels: # Label matching app: hello-gin # Tag KeyValue template: # Pod template metadata: # Pod metadata labels: # Pod tag app: hello-gin # Pod tag, which is the same as the above deployment The label in the selector corresponds to spec: # Pod object specification containers: # container - name: hello-gin # Container name image: jxlwqq/hello-gin:latest # Image name: image version resources: # Resource constraints limits: # It is simply understood as max resource value memory: "128Mi" cpu: "500m" requests: # It is simply understood as min resource value memory: "128Mi" cpu: "500m" ports: # port - containerPort: 8080 # Port number --- apiVersion: v1 # api version kind: Service # object type metadata: # metadata name: hello-gin-svc # Object name spec: # Statute selector: # selector app: hello-gin # Label selector, corresponding to the label of Pod ports: - port: 8080 # Service port number targetPort: 8080 # Port number of Pod exposure
ingress.yaml file interpretation:
apiVersion: networking.k8s.io/v1 # api version kind: Ingress # object type metadata: # metadata name: hello-gin-ingress # Corresponding name spec: # Statute rules: # rule - http: paths: # route - path: / pathType: Prefix backend: # Back end service service: # service name: hello-gin-svc # service name port: number: 8080 # Port number
Access verification:
curl 127.0.0.1/hello # Back to Hello, Gin!
clear
kubectl delete -k .