(一)部署集群镜像仓库
1. 集群配置
首先看一下集群配置:
(base) ➜ ~ multipass ls
Name State IPv4 Image
master Running 192.168.64.5 Ubuntu 22.04 LTS
10.42.0.0
10.42.0.1
nfs Running 192.168.64.4 Ubuntu 22.04 LTS
worker Running 192.168.64.7 Ubuntu 22.04 LTS
10.42.1.0
10.42.1.1
(base) ➜ ~ kubectl get node
NAME STATUS ROLES AGE VERSION
worker Ready <none> 140m v1.28.7+k3s1
master Ready control-plane,master 149m v1.28.7+k3s1
(base) ➜ ~ kubectl get pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/registry-pv 1Gi RWX Retain Bound default/registry-pvc registry-pv 116m
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/registry-pvc Bound registry-pv 1Gi RWX registry-pv 116m
(base) ➜ ~ showmount -e 192.168.64.4
Exports list on 192.168.64.4:
/home/ubuntu/nfs 10.0.0.0/1 192.0.0.1/1
当前有三个节点,1个是nfs服务器,另两个是k8s集群节点。
nfs挂载点是192.168.64.4:/home/ubuntu/nfs。
k8s上创建了pv和pvc持久存储资源,pv了绑定nfs。
2. 使用helm安装registry
Helm是k8s集群上的包管理工具,类似于mac的brew和ubuntu的apt。Registry是docker的私有镜像仓库。
在mac宿主机上,通过 brew install helm
可以一键安装helm。
到heml官网https://artifacthub.io/packages/helm搜索docker-registry,找到repo地址为https://helm.twun.io,添加repo并安装registry
(base) ➜ ~ helm repo add twun https://helm.twun.io #添加helm repo
(base) ➜ ~ helm repo list #查看当前repos
NAME URL
twun https://helm.twun.io
(base) ➜ ~ helm search repo twun/docker-registry #列出指定repo内发布的包
NAME CHART VERSION APP VERSION DESCRIPTION
twun/docker-registry 2.2.2 2.8.1 A Helm chart for Docker Registry
(base) ➜ ~ helm install registry twun/docker-registry \
--namespace system \
--set service.type=NodePort \
--set service.nodePort=31500 \
--set persistence.existingClaim=registry-pvc
安装docker-registry时指定了pvc参数,用于持久化存储,也指定了外部访问的端口31500。关于docker-registry支持的配置参数,可到官网查看文档:https://artifacthub.io/packages/helm/twuni/docker-registry
至此,registry安装完毕。
(二)向仓库推送镜像和拉取镜像
1. 修改docker安全策略
我们安装registry时未配置ssl证书,只能通过http访问。
docker使用私有仓库时,默认需要通过https访问,若通过http访问,需要修改docker配置文件daemon.json,将私有库IP添加到insecure-registries:
{
"insecure-registries": [
"192.168.64.5:31500"
]
}
2. 修改k8s节点的registry配置
逐个登录k8s master节点,创建/etc/rancher/k3s/registries.yaml文件,写入配置内容,并重启k3s服务:
ubuntu@master:~$ sudo vim /etc/rancher/k3s/registries.yaml
mirrors:
"192.168.64.5:31500":
endpoint:
- "http://192.168.64.5:31500"
ubuntu@master:~$ sudo service k3s restart
逐个登录k8s worker节点,创建/etc/rancher/k3s/registries.yaml文件,写入配置内容,并重启k3s-agent服务:
ubuntu@worker:~$ sudo vim /etc/rancher/k3s/registries.yaml
mirrors:
"192.168.64.5:31500":
endpoint:
- "http://192.168.64.5:31500"
ubuntu@worker:~$ sudo service k3s-agent restart
3. 拉取测试镜像并重新打标签
在宿主机上利用docker拉取一个nginx镜像作为测试。
(base) ➜ ~ docker pull nginx:latest
(base) ➜ ~ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 92b11f67642b 4 weeks ago 187MB
使用tag命令修改镜像名,将私有仓库的地址作为镜像的前缀。
(base) ➜ ~ docker tag nginx:latest 192.168.64.5:31500/nginx:latest
(base) ➜ ~ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.64.5:31500/nginx latest 92b11f67642b 4 weeks ago 187MB
nginx latest 92b11f67642b 4 weeks ago 187MB
4. 向私有仓库推送镜像和拉取镜像
向私有仓库推送镜像:
(base) ➜ ~ docker push 192.168.64.5:31500/nginx:latest
删除本地测试镜像:
(base) ➜ ~ docker image rm 192.168.64.5:31500/nginx:latest
(base) ➜ ~ docker image rm nginx:latest
(base) ➜ ~ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
从私有仓库拉取镜像:
(base) ➜ ~ docker pull 192.168.64.5:31500/nginx:latest
(base) ➜ ~ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.64.5:31500/nginx latest 92b11f67642b 4 weeks ago 187MB
测试成功。
(三) 使用Dockerfile打包镜像
1. 打包镜像方法
在制作镜像时,首先准备好需要复制到镜像中的文件,包括程序文件和配置文件。再通过Dockerfile中的指令进行文件复制、程序运行和启动配置。
Dockefile的主体包括如下几个部分:
FROM rackspacedot/python37:latest #指明基础镜像包
COPY xxx /xxx/ #将Dockerfile同目录下的xxx文件或目录拷贝到生成镜像中的/xxx/目录下
RUN xxx #这里相当于在bash里执行指令,每条指令用一个RUN来标记,完成service文件的chmod修改等
MAINTAINER name email #留下你的大名和邮箱
EXPOSE 10000 #暴露端口号
ENTRYPOINT xxx #这个是启动执行命令,只能有一条
CMD xxx #这个也是启动执行命令(或给ENTRYPOINT传递默认参数),若启动容器时附加了参数,则CMD中的命令会被忽略
2. 实操
Dockerfile文件:
vue3项目打包后生成dist目录,在与dist平级的目录下新建文件Dockerfile,编辑内容:
FROM 192.168.64.5:31500/nginx:latest
COPY dist/ /usr/share/nginx/html/
其中,我们基于上一步推送到私有仓库的nginx镜像为基础,将dist目录下的内容拷贝到nginx镜像的web目录下。
打包镜像:
(base) ➜ ~ docker build -t 192.168.64.5:31500/frontend:1.0 .
推送到集群中的私有仓库:
(base) ➜ ~ docker push 192.168.64.5:31500/frontend:1.0
(四) 启动服务
编写yaml文件frontend.yaml:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: vue3-deployment
spec:
replicas: 2
selector:
matchLabels:
app: vue3
template:
metadata:
labels:
app: vue3
spec:
containers:
- name: vue3
image: 192.168.64.5:31500/frontend:1.0
---
# 通过service暴露端口:
apiVersion: v1
kind: Service
metadata:
name: vue3
namespace: default
labels:
app: vue3
spec:
ports:
- port: 80
targetPort: 80
nodePort: 30080
protocol: TCP
selector:
app: vue3
type: NodePort
该文件指定k8s使用刚才上传的镜像生成容器,并通过Service将pod的服务通过30080端口开放给集群外使用。
启动服务:
(base) ➜ ~ kubectl create -f frontend.yaml
(base) ➜ .kube kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 7h6m
vue3 NodePort 10.43.207.91 <none> 80:30080/TCP 17m
(base) ➜ ~ kubectl get pod
NAME READY STATUS RESTARTS AGE
vue3-deployment-86469c7667-npxm2 1/1 Running 0 25s
vue3-deployment-86469c7667-5t69q 1/1 Running 0 25s
yaml文件中为服务配置了两个pod,如上所示,可看到服务的确被部署到两个pod上。生产环境下有多个worker节点时,可为服务配置更多的pod,这些pod会被调度到不同物理节点上,可起到负载均衡的作用。
浏览器访问集群任一node的30080端口(192.168.64.5:30080或192.168.64.7:30080),可看到本地应用已经成功部署到k8s集群。