前面已经安装好了k8s集群,并且k8s管理页面使用密码,域名登录,现在开始使用k8s部署java服务。
私人仓库有多种,用得比较多的是habor,我这里就不用这么复杂了,就直接用docker提供的私人仓库即可。
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
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
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,镜像名称
#先登录
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
创建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包这里就不展示了
#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"]
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 #查看镜像
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
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
服务部署相对简单一些但是也要注意几点,