前言

前面已经安装好了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 创建一个文件夹用来放用户名密码,然后在新创建一个账户

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

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

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

重新加载docker

sudo systemctl daemon-reload
sudo systemctl restart docker

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

-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.5 k8s创建秘钥

创建webservice空间

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

二、制作镜像

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"]

生成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 #查看镜像

在这里插入图片描述

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

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

  imagePullSecrets:
    - name: registry-secret-name

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

2.3 创建depoymont

kubectl apply -f springbootDeployment.yaml
kubectl get svc --all-namespaces

查看开放的端口
在这里插入图片描述
这里使用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. 推送镜像的时候,要先登录仓库再进行推送,否则会找不到镜像。
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐