云原生部署手册02:将本地应用部署至k8s集群

(一)部署集群镜像仓库

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集群。
请添加图片描述

  • 18
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker和Kubernetesk8s)都是当今非常热门的技术,用于容器应用程序的部署和管理。 Docker是一个开源项目,它可以将应用程序及其依赖项打包到一个可移植的容器中,并在不同的环境中进行部署。Docker容器非常轻量化和灵活,可以在不同的操作系统上运行,提供了一致的运行环境。Docker还可以通过镜像的方式进行快速部署和扩展,节省了部署和维护的时间和成本。 Kubernetes是一个用于容器编排和管理的开源平台。它可以自动化容器应用程序的部署、扩展和管理。Kubernetes提供了一种弹性和可扩展的方式来管理容器应用程序,可以动态地调整容器的数量和配置。它还提供了监控、日志和故障恢复等功能,使得应用程序在集群中更加可靠和稳定。 在将应用程序部署Kubernetes集群中时,首先需要将应用程序打包成Docker镜像。然后,使用Kubernetes的API或命令行工具来创建和配置一组Pod(一个或多个容器的组合)。Pod是Kubernetes的最小部署单位,它可以包含一个或多个容器,共享网络和存储资源。可以根据应用程序的需求定义Pod的资源限制和请求,并使用Kubernetes的调度器在集群中自动分配和调度Pod。 一旦Pod被创建,Kubernetes将根据指定的副本数量自动复制和扩展Pod。Kubernetes还提供了服务发现、负载均衡和网络隔离等功能,使得应用程序可以方便地与其他Pod和服务进行通信。 总而言之,通过使用Docker和Kubernetes的组合,我们可以实现高效、可扩展和可靠的容器应用程序部署和管理。它们可以帮助我们更好地利用硬件资源,简化应用程序的部署过程,并提供高可用性和弹性。这对于现代化的云原生应用程序开发和运维来说是非常重要的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值