文章目录
- 前言
- 一、搭建私人仓库
- 1.1 拉取仓库镜像
- 1.2 创建一个文件夹用来放用户名密码,然后在新创建一个账户
- 1.3 Registry服务默认会将上传的镜像保存在容器的/var/lib/registry,我们将主机的/opt/registry目录挂载到该目录,即可实现将镜像保存到主机的/opt/registry目录了。然后将宿主机的/var/auth目录挂载到镜像的/auth目录下,然后指定这个目录下的htpasswd文件来进行认证
- 1.4 推送镜像
- 1.5 k8s创建秘钥
- 二、制作镜像
- 2.1.编写dockerfile文件
- 2.2.编写deployment文件
- 2.3 创建depoymont
- 三、测试
- 总结
前言
前面已经安装好了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
总结
服务部署相对简单一些但是也要注意几点,
- docker registry安装相对harbor简单,但是对于镜像的管理就没有habor友好了,需要使用指令 docker rmi docker镜像名字去删除。habor提供界面方式操作,方便很多。
- 推送镜像的时候,要先登录仓库再进行推送,否则会找不到镜像。