minikube k8s 部署第一个应用

348 阅读2分钟

Docker镜像制作以及上传

  1. 创建java 项目, 并打jar包
  2. 编写Dockerfile 文件制作docker 镜像
FROM ascdc/jdk8
VOLUME /log ./log
ADD ./target/demo-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
  • 构建镜像(注意后面这个点)
docker build -f Dockerfile -t test-demo:v1 .  
  1. 将镜像上传至阿里云镜像库
1.重命名镜像:
docker tag ${镜像id} registry.cn-beijing.aliyuncs.com/test-dev/test-demo:v1
2.登录阿里云镜像库:
sudo docker login --username=${userName} registry.cn-beijing.aliyuncs.com
3.上传镜像:
docker push registry.cn-beijing.aliyuncs.com/test-dev/test-demo:v1

因为拉取私有仓库需要密钥,所以我们先给k8s创建私库的secret,名字为:test-aliyun-registry

kubectl create secret docker-registry test-aliyun-registry -n default --docker-server=registry.cn-beijing.aliyuncs.com --docker-username=${userName} --docker-password=${password}

编写deployment文件,部署两个pod

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: test-demo
  template:
    metadata:
      labels:
        app: test-demo
    spec:
      serviceAccountName: default
      imagePullSecrets:
        - name: test-aliyun-registry
      containers:
        - name: test-demo
          image: registry.cn-beijing.aliyuncs.com/test-dev/test-demo:v1
          imagePullPolicy: Always
          ports:
            - containerPort: 8077
          volumeMounts:
            - name: test-demo-data
              mountPath: /logs
      volumes:
        - name: test-demo-data
          hostPath:
            path: /opt/data/test-demo

编写service文件,使用service暴露端口

apiVersion: v1
kind: Service
metadata:
  name: test-demo-service
spec:
  type: NodePort
  ports:
    - protocol: TCP
      port: 13306
      targetPort: 8077
      nodePort: 30001
  selector:
    app: test-demo

此时我们的服务就部署完毕了, 但是因为我们用的minikube 是基于docker的,此时并不能访问到我们服务,要想在宿主机上访问我们的系统,需要使用minikube 想service 的nodeport 端口映射到本地, 执行完成后会输出url, 命令如下:

minikube service  test-demo-service

使用ingress 做转发对外提供服务

此时我们发现使用service 的nodeport功能暴露端口,会随着服务的增多,要暴露的端口越来越多,不利于管理,故我们需要一个利于统一管理的服务,统一对外提供服务转发,故本示例使用k8s官方推荐的ingress,注意:ingress是基于ngnix,可参考nginx 配置,映射到你对应的service 的name 和port就可以了

1. minikue 开启ingress:
minikube addons enable ingress
2. 对外开放ingress 端口
minikube tunnel 
3. 部署ingres:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-ingress
spec:
  rules:
    - host: test.info
      http:
        paths:
          - path: /test
            pathType: Prefix
            backend:
              service:
                name: test-demo-service
                port:
                  number: 13306

总结:

这样一个简单的k8s 部署java 的流程就完成了,当然k8s 生态还有很多非常有用的插件,如kong 等,后续接着尝试。