• 4.k8s部署私人仓库并且部署java服务案例



    前言

    前面已经安装好了k8s集群,并且k8s管理页面使用密码,域名登录,现在开始使用k8s部署java服务。


    一、搭建私人仓库

    私人仓库有多种,用得比较多的是habor,我这里就不用这么复杂了,就直接用docker提供的私人仓库即可。

    1.1 拉取仓库镜像

    docker pull registry:2.6.2
    
    latest: Pulling from library/registry
    79e9f2f55bf5: Pull complete 
    0d96da54f60b: Pull complete 
    5b27040df4a2: Pull complete 
    e2ead8259a04: Pull complete 
    3790aef225b9: Pull complete 
    Digest: sha256:169211e20e2f2d5d115674681eb79d21a217b296b43374b8e39f97fcf866b375
    Status: Downloaded newer image for registry:latest
    docker.io/library/registry:latest
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    1.2 创建一个文件夹用来放用户名密码,然后在新创建一个账户

    mkdir /var/auth
    docker run --entrypoint htpasswd registry:2.6.2 -Bbn jiangbingsong 123456 >/var/auth/htpasswd
    cat /var/auth/htpasswd
    
    • 1
    • 2
    • 3

    修改/etc/docker 下的deamon.json添加下面的内容,这个json的修改和重启docker在所有节点都执行。

      "insecure-registries":["192.168.184.129:5000"]
    
    • 1

    重新加载docker

    sudo systemctl daemon-reload
    sudo systemctl restart docker
    
    • 1
    • 2

    1.3 Registry服务默认会将上传的镜像保存在容器的/var/lib/registry,我们将主机的/opt/registry目录挂载到该目录,即可实现将镜像保存到主机的/opt/registry目录了。然后将宿主机的/var/auth目录挂载到镜像的/auth目录下,然后指定这个目录下的htpasswd文件来进行认证

    docker run -d -v /opt/registry:/var/lib/registry -v /var/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd  -p 5000:5000 --restart=always --name registry registry:2.6.2
    
    
    • 1
    • 2

    -p 5000:5000,指定registry的端口是5000并映射成主机的5000端口。
    -v /opt/registry:/var/lib/registry,将本地的/opt/registry挂载到镜像默认存储路径 /var/lib/registry。

    -v /var/auth:/auth 将第二步生成auth文件夹挂在到镜像auth目录。

    -e REGISTRY_AUTH=htpasswd, -e REGISTRY_AUTH_HTPASSWD_REALM=Registry_Realm,这两个参数组合启动基本身份验证。
    -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd,指定使用的密码认证文件是/auth/htpasswd。(注意,使用的是容器里面的路径,前面我们已经将/var/auth挂在到/auth)

    如果有https证书,可以加上以下参数:
    -v /usr/local/nginx/conf/cert:/certs,如果有https认证,将宿主机保存的认证文件挂到容器里。
    -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.pem,-e REGISTRY_HTTP_TLS_KEY=/certs/server.key 指定https证书和key。
    –restart=always,重启方式为always。
    –name registry,指定容器名称。
    registry,镜像名称

    1.4 推送镜像

    #先登录
    docker login 192.168.184.129:5000
    #推送镜像
    docker tag registry:2.6.2 192.168.184.129:5000/registry:2.6.2
    docker push 192.168.184.129:5000/registry:2.6.2
    #查看镜像
    curl -u jiangbingsong:123456 192.168.184.129:5000/v2/_catalog
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1.5 k8s创建秘钥

    创建webservice空间

    kubectl create namespace webservice
    
    • 1
    kubectl create secret docker-registry registry-secret-name --docker-server=192.168.184.129:5000 --docker-username=jiangbingsong --docker-password=123456 -n webservice
    
    
    • 1
    • 2

    二、制作镜像

    demo-0.0.1-SNAPSHOT.jar 为自己打包的jar包这里就不展示了

    2.1.编写dockerfile文件

    #java:8 是使用jdk版本
    FROM openjdk:8-jdk-alpine
    
    #指定了临时文件目录为/tmp。
    VOLUME /tmp/service
    
    #添加jar到容器并重命名
    ADD demo-0.0.1-SNAPSHOT.jar /app.jar
    
    #执行jar文件
    ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    生成image并且推送私人仓库
    在这里插入图片描述

    docker build -t springbootdemo .
    #先登录
    docker login 192.168.184.129:5000
    docker tag springbootdemo 192.168.184.129:5000/springbootdemo#推送镜像
    docker push 192.168.184.129:5000/springbootdemo 
    curl -u jiangbingsong:123456 192.168.184.129:5000/v2/_catalog #查看镜像
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    2.2.编写deployment文件

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: springbootdeploy
      namespace: webservice
    spec:
      replicas: 3
      selector:
        matchLabels:
          run: springbootdemo
      template:
        metadata:
          labels:
            run: springbootdemo
        spec:
          containers:
            - name: springbootdemo
              image: 192.168.184.129:5000/springbootdemo
              volumeMounts:
                - name: host-time
                  mountPath: /etc/localtime
              ports:
                - containerPort: 8008
              resources:
                requests:
                  cpu:  1
                  memory: 1024Mi
                limits:
                  cpu:  1
                  memory: 1024Mi
    
          imagePullSecrets:
            - name: registry-secret-name
          volumes:
            - name: host-time
              hostPath:
                path: /etc/localtime
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: springbootdemo
      namespace: webservice
      labels:
        run: springbootdemo
    spec:
      type: NodePort
      ports:
        - port: 8008
      selector:
        run: springbootdemo
    
    • 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

      imagePullSecrets:
        - name: registry-secret-name
    
    • 1
    • 2

    这里secrets为刚刚创建的秘钥,image为刚刚推送到私人仓库的image

    2.3 创建depoymont

    kubectl apply -f springbootDeployment.yaml
    kubectl get svc --all-namespaces
    
    • 1
    • 2

    查看开放的端口
    在这里插入图片描述
    这里使用nodeport方式暴露服务,这里可以看到端口为30952
    http://192.168.184.129:30952为我暴露的服务。接口如下,正常返回应该是“你好”
    在这里插入图片描述

    三、测试

    测试结果如下图
    http://192.168.184.129:30952/hello
    在这里插入图片描述

    总结

    服务部署相对简单一些但是也要注意几点,

    1. docker registry安装相对harbor简单,但是对于镜像的管理就没有habor友好了,需要使用指令 docker rmi docker镜像名字去删除。habor提供界面方式操作,方便很多。
    2. 推送镜像的时候,要先登录仓库再进行推送,否则会找不到镜像。
  • 相关阅读:
    微服务框架 SpringCloud微服务架构 8 Gateway 网关 8.1 网关作用介绍
    LeetCode(24)文本左右对齐【数组/字符串】【困难】
    [附源码]JAVA毕业设计农产品的物流信息服务平台(系统+LW)
    LeetCode 面试题 04.05. 合法二叉搜索树
    华为仓颉编程语言观感
    Python吴恩达深度学习作业19 -- 字符级语言模型
    产品发布+联合演讲+认证+奖项丨云和恩墨在openGauss Developer Day 2023主论坛大放异彩...
    Redis新篇一:认识Redis
    (手工)【sqli-labs靶场1-4】GET请求、错误注入、单引号、双引号、括号闭合、字符型、整型
    Kafka、ActiveMQ、RabbitMQ、RocketMQ 的区别
  • 原文地址:https://blog.csdn.net/qq_34526237/article/details/132804399