Kubernetes部署Nexus3

之前一直直接使用docker run的形式部署各种服务,最近把新购置的几台服务器组了个kubernetes集群,趁休陪产假在家,决定把之前的服务全部都转移到K8S集群中来管理部署。今天的任务是把Nexus转移到Kubernetes中。

0x01. 创建命名空间

为了方便Kubernetes中的资源管理,通常针对项目将各种资源划分布到不同的Namespace中,所以我们创建一个名为repo-nexus的命名空间,配置文件repo-nexus-ns.yaml内容如下:

apiVersion: v1
kind: Namespace
metadata:
   name: repo-nexus
   labels:
     name: repo-nexus

使用命令,应用配置

kubectl apply repo-nexus-ns.yaml 

查看系统中的命名空间

[root@lemonitcn-aa lemonitcn-repo]# kubectl get namespace
NAME          STATUS   AGE
default       Active   13d
kube-public   Active   13d
kube-system   Active   13d
repo-nexus    Active   1m

0x02. 创建PV/PVC

在Kubernetes中,数据存储方式有很多,由于我部署的Nexus仓库是生产环境使用的,不是做测试,所以根据实际情况,这里选择了PV/PVC的形式,然后将实际产生的数据保存在单独的一台NFS机器上。NFS搭建不是本文的关注点,在这里不做描述,很简单,大家可以自己搜索教程。

创建PV/PVC的配置文件repo-nexus-data.yaml,内容如下:

---
# pv

apiVersion: v1
kind: PersistentVolume
metadata:
  name: repo-nexus-pv
spec:
  capacity:
    storage: 100Gi
  accessModes:
    - ReadWriteMany
  nfs:
       server: 172.28.1.200
       path: "/kubernetes/repo-nexus"

---
# pvc

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: repo-nexus-pvc
  namespace: repo-nexus
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: ""
  resources:
    requests:
      storage: 100Gi

注意!!!一定要在nfs机器上执行以下命令修改nfs中/kubernetes/repo-nexus目录的所有者(或者无论你使用任何存储方式,只要使用nexus3的官方镜像,都要将最后的实际存储目录进行chown操作),否则pod启动会报错目录无权限或无法写入文件的错误:

chown -R 200 /kubernetes/repo-nexus

pv中的nfs字段描述这里使用NFS作为PV数据存储方式,其中的server指定NFS的服务器IP地址,path为在NFS服务器具体挂载的子目录路径
需要注意的是PV并不绑定命名空间,也就是说,特殊情况下,创建PV之后可以在不同的namespace中创建PVC进行数据访问。
一定要将PV和PVC中accessModes和storage字段要匹配上!

使用命令,应用配置

kubectl apply repo-nexus-data.yaml

查看PV和PVC创建情况

[root@lemonitcn-aa lemonitcn-repo]# kubectl get pv
NAME            CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                       STORAGECLASS   REASON   AGE
repo-nexus-pv   100Gi      RWX            Retain           Bound    repo-nexus/repo-nexus-pvc                           2m
[root@lemonitcn-aa lemonitcn-repo]# kubectl get pvc -n repo-nexus
NAME             STATUS   VOLUME          CAPACITY   ACCESS MODES   STORAGECLASS   AGE
repo-nexus-pvc   Bound    repo-nexus-pv   100Gi      RWX                           2m

0x03. 开始部署Nexus

我们需要创建Deployment、Service和Ingress三部分资源来进行部署,首先我们创建配置文件repo-nexus.yaml,内容如下:

---
# deployment

kind: Deployment
apiVersion: apps/v1
metadata:
  labels:
    app: repo-nexus
  name: repo-nexus
  namespace: repo-nexus
spec:
  replicas: 1
  selector:
    matchLabels:
      app: repo-nexus
  template:
    metadata:
      labels:
        app: repo-nexus
    spec:
      containers:
        - name: repo-nexus
          image: registry.docker-cn.com/sonatype/nexus3:latest
          imagePullPolicy: IfNotPresent
          ports:
          - containerPort: 8081
            protocol: TCP
          volumeMounts:
          - name: repo-nexus-data
            mountPath: /nexus-data
      volumes:
        - name: repo-nexus-data
          persistentVolumeClaim:
            claimName: repo-nexus-pvc

---
# service

kind: Service
apiVersion: v1
metadata:
  labels:
    app: repo-nexus
  name: repo-nexus
  namespace: repo-nexus
spec:
  ports:
    - port: 8081
      targetPort: 8081
  selector:
    app: repo-nexus

---
# ingress

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: repo-nexus
  namespace: repo-nexus
spec:
  rules:
  - host: repo.lemonit.cn
    http:
      paths:
      - path: /
        backend:
          serviceName: repo-nexus
          servicePort: 8081

A. Deployment相关说明

  • 在这里,我使用的是官方镜像,registry.docker-cn.com/sonatype/nexus3:latest,registry.docker-cn.com是docker国内镜像仓库,与docker-hub是镜像同步的,使用国内仓库能增加镜像pull速度和访问稳定性。
  • 参考官方docker镜像说明文档(https://hub.docker.com/r/sonatype/nexus3/),我们可以看出映射出来的端口号是8081,所以我们在这里将containerPort设置为8081
  • 同样,因为官方文档中指出,镜像所使用的数据全部挂载了运行时容器的/nexus-data目录下,所以我们将template/spec/containers/volumeMounts/mountPath设置成了/nexus-data
  • 因为我们在上一步骤中,创建的PVC名称为repo-nexus-pvc,所以这里要注意template/spec/volumes/persistentVolumeClaim/claimName的设置要与其一致

B. Service相关说明

  • 注意spec/port/targetPort要设置成8081,与容器实际端口保持一致
  • 这里为了方便记忆,将service的port也设置成了8081
  • 注意namespace为repo-nexus

C. Ingress相关说明

  • 这里我直接使用了域名host做区分,所以path设置成了/,你也可以根据自身的实际情况进行设置

接下来,我们使用命令将其部署生效:

kubectl apply -f repo-nexus.yaml 

查看运行状态

[root@lemonitcn-aa lemonitcn-repo]# kubectl get svc -n repo-nexus
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
repo-nexus   ClusterIP   10.101.251.216           8081/TCP   2m
[root@lemonitcn-aa lemonitcn-repo]# kubectl get pods -n repo-nexus
NAME                          READY   STATUS    RESTARTS   AGE
repo-nexus-5d597dd848-gkcjf   1/1     Running   1          2m
[root@lemonitcn-aa lemonitcn-repo]# kubectl get ingress -n repo-nexus
NAME         HOSTS                      ADDRESS   PORTS   AGE
repo-nexus   repo.lemonit.cn            80      2m
[root@lemonitcn-aa lemonitcn-repo]# kubectl get deploy -n repo-nexus
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
repo-nexus   1         1         1            1           2m

到此为止,大功告成,如果你发现你的pod没有运行起来,可以使用kubectl logs pod-name进行日志查询。如果发现提示创建文件或文件夹权限有问题,一定要确认是否执行了第二步中提到的命令

chown -R 200 /kubernetes/repo-nexus

你可能感兴趣的:(Kubernetes部署Nexus3)