准备
首先准备一个最简单的一个demo,一个rest接口。我们的目的是将这个demo部署到k8s集群中,并访问到。这里暴露的端口是8080
本地运行jar包
本地访问
镜像打包
-
先将jar包上传至master上的一个文件夹内
-
编写Dockerfile
#创建文件 vim Dockerfile ##内容 FROM java:8 COPY demo.jar app.jar EXPOSE 8080 ENTRYPOINT ["java","-jar","/app.jar"]
-
构建镜像(注意最后还有一个点)
docker build -t k8s_demo:1.0 .
可以看到一个名为k8s_demo:1.0的镜像现在已经构建好了
-
部署镜像仓库(两个仓库二选一,一般采用harbor)
1.Docker Registry
docker run -d -v /etc/images/registry:/var/lib/registry -p 5000:5000 --restart=always --name my-registry registry docker ps
#查看本地仓库镜像 #通过ip curl http://192.168.101.100:5000/v2/_catalog #通过域名 curl http://k8s.master:5000/v2/_catalog
可以发现是空的,空的就对了,我们还没有上传我们的镜像2.Harbor
安装docker-compose
#下载指定版本的docker-compose curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose #对二进制文件赋可执行权限 chmod +x /usr/local/bin/docker-compose #验证docker-compose安装是否成功 docker-compose --version
下载harbor安装包
harbor各个发行版的github地址:https://github.com/goharbor/harbor/releases,可以自己去下载各个版本的harbor,最后上传到你的服务器,或者直接在服务器上面拉取,我用的v2.4.1这个harbor版本,仓库版本不重要,只要能用就行
tar -zxvf harbor-online-installer-v2.4.1.tgz
cd harbor
这里需要做两个步骤,copy一份安装用的yml,进行修改
cp harbor.yml.tmpl harbor.yml
vim harbor.yml
修改后
运行install.sh
./install.sh
第一次会拉很多相关的镜像,需要等待一会儿。
至此harbor安装运行成功,此时会多出一个docker-compose.yml的文件,下次启动的时候直接执行以下命令启动
docker-compose -f docker-compose.yml up -d
需要停止harbor,进入你的yaml目录下面执行:
docker-compose -f docker-compose.yml down
- 上传镜像
为了让客户端服务器能够快速地访问刚刚在服务端搭建的镜像仓库(默认情况下是需要配置HTTPS证书的),这里简单在客户端配置一下私有仓库的可信任设置让我们可以通过HTTP直接访问:# vim /etc/docker/daemon.json,以下操作根据自己安装的仓库进行配置
Docker Registry 配置
以下操作需要在每台节点上运行,每台节点都必须能够访问到镜像仓库
vim /etc/docker/daemon.json
# 添加如下内容
"insecure-registries": ["192.168.101.100:5000"]
#或者使用域名
#"insecure-registries": ["http://k8s.master"]
#重启docker
systemctl restart docker
Harbor配置
以下操作需要在每台节点上运行,每台节点都必须能够访问到镜像仓库
vim /etc/docker/daemon.json
# 添加如下内容
"insecure-registries": ["192.168.101.100"]
#或者使用域名
#"insecure-registries": ["http://k8s.master"]
#重启docker
systemctl restart docker
harbor账号配置可以自己去找一找
这里要看自己master的ip,还有一定要把自己的防火墙关了(自己玩玩可以),修改完配置文件一定要重启docker
上传镜像至私有仓库,这里只描述采用harbor仓库的情况:
登录harbor仓库
浏览器输入harbor所在主机ip即可(默认80端口)。admin默认密码Harbor12345,若要修改admin或者新增harbor用户的话,可以自己去配置,这里就不多说这个问题了。
创建项目
修改镜像名称为 仓库地址/仓库名称/镜像名称:TAG
注意,这里打tag的仓库地址要和insecure-registries当时配置的仓库地址一致,配置的ip就写ip,配置的域名就写域名
push的时候报unauthorized,没有权限的话需要先登录(用户名和密码和登录harbor客户端一样)
#镜像打Tag(docker tag 镜像名称:tag 仓库地址/镜像名称:tag)
docker tag k8s_demo:1.0 192.168.101.100/k8s_test/k8s_demo:1.0
#可信任设置配置的是域名的话仓库地址需要为域名
#docker tag k8s_demo:1.0 k8s.master/k8s_test/k8s_demo:1.0
#docker push 镜像仓库地址/镜像名称:标签(版本)
docker push 192.168.101.100/k8s_test/k8s_demo:1.0
#docker push k8s.master/k8s_test/k8s_demo:1.0
这里可信配置我是配置的域名,这个得看自己各自的配置修改镜像名称
push过后可以在仓库上面看到自己推上去的镜像
至此镜像制作完成
部署
这里我在另一个文件夹中执行创建pod的操作
-
创建demo应用的deployment编排文件(deploy维护的是pod,k8s容器最基本的运行单位)
vim demo_deploy.yaml apiVersion: apps/v1 kind: Deployment metadata: name: k8s-demo labels: app: k8s-demo spec: replicas: 2 selector: matchLabels: app: k8s-demo template: metadata: labels: app: k8s-demo spec: containers: - name: k8s-demo image: k8s.master/k8s_test/k8s_demo:1.0 imagePullPolicy: IfNotPresent ports: - containerPort: 8080
注意
镜像的仓库地址为自己的镜像的地址
编排文件里面name,labels标签的值不能带有下划线,不然会报错
-
运行deployment
kubectl apply -f demo_deploy.yaml #查看运行 kubectl get deploy kubectl get pod -o wide
这是我们刚刚创建的deploy应用。一个k8s-demo的应用有两个副本。依次检查各个pod的运行情况
kubectl describe pod k8s-demo-99b8765bf-9rwsk
kubectl describe pod k8s-demo-99b8765bf-nrvzj
发现两个副本被分别运行在node1,node2节点(这里因为后续网络的问题,集群节点换了ip)。
分别去两个节点去看docker运行情况,可以发现两台节点分别运行了一个docker容器,跑的就是我们的k8s_demo
但是我们发现ports并没有暴露,因为k8s的访问策略默认为clusterIp,这种模式下,只能集群内部进行访问,而不会暴露给外部,如下:
分别在node1和node2上面去curl 对方的测试接口
ClusterIP集群内部直接请求时可以的,通过宿主机是不行的
下一章节部署Service和ingress,实现通过NodePort和ingress的方式访问应用