之前一直直接使用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