在Kubernetes(简称K8S)中使用Jenkins进行部署是一种常见的做法。Jenkins是一个开源的持续集成和持续交付工具,可用于自动化构建、测试和部署应用程序。本文将以800字以上的篇幅,向刚入行的小白介绍如何在K8S中部署Jenkins,并提供相应的代码示例。

#### 整体流程概览
下表展示了在K8S中部署Jenkins的整个流程:

| 步骤 | 描述 |
| --- | --- |
| 步骤 1 | 安装并配置Kubernetes集群 |
| 步骤 2 | 创建Jenkins部署所需的命名空间 |
| 步骤 3 | 配置Jenkins的持久化存储 |
| 步骤 4 | 创建并运行Jenkins的Deployment和Service对象 |
| 步骤 5 | 获取Jenkins的管理员密码 |
| 步骤 6 | 配置Jenkins凭证 |
| 步骤 7 | 配置Kubernetes插件 |
| 步骤 8 | 配置Jenkins主机URL |
| 步骤 9 | 启动Jenkins的一次性构建作业 |

#### 步骤一:安装并配置Kubernetes集群
首先,你需要安装并配置一个Kubernetes集群。可以使用minikube、kubeadm或云上的托管服务如GKE、AKS等。这些步骤超出了本文的范围,你可以参考官方文档或其他资源来完成这一步骤。

#### 步骤二:创建Jenkins部署所需的命名空间
在Kubernetes中,命名空间(Namespace)是用于在集群中隔离和组织资源的一种方式。我们首先创建一个命名空间来部署Jenkins。

```bash
# 创建jenkins命名空间
kubectl create namespace jenkins
```

#### 步骤三:配置Jenkins的持久化存储
为了保存Jenkins的配置和数据,我们需要配置一个持久化存储卷(Persistent Volume)和一个持久化存储卷声明(Persistent Volume Claim)。

```yaml
# jenkins-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: jenkins-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /var/jenkins
---
# jenkins-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jenkins-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
volumeName: jenkins-pv
storageClassName: ""
```

#### 步骤四:创建并运行Jenkins的Deployment和Service对象
接下来,我们需要创建一个Deployment对象和一个Service对象以部署Jenkins。

```yaml
# jenkins-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins-deployment
namespace: jenkins
spec:
replicas: 1
selector:
matchLabels:
app: jenkins
template:
metadata:
labels:
app: jenkins
spec:
containers:
- name: jenkins
image: jenkins/jenkins:lts
ports:
- containerPort: 8080
- containerPort: 50000
volumeMounts:
- name: jenkins-persistent-storage
mountPath: /var/jenkins
volumes:
- name: jenkins-persistent-storage
persistentVolumeClaim:
claimName: jenkins-pvc
---
# jenkins-service.yaml
apiVersion: v1
kind: Service
metadata:
name: jenkins-service
namespace: jenkins
spec:
selector:
app: jenkins
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: LoadBalancer
```

将这两个配置文件分别保存为`jenkins-deployment.yaml`和`jenkins-service.yaml`,然后使用以下命令来创建Deployment和Service对象:

```bash
# 创建Deployment对象
kubectl apply -f jenkins-deployment.yaml

# 创建Service对象
kubectl apply -f jenkins-service.yaml
```

#### 步骤五:获取Jenkins的管理员密码
一旦Jenkins的Deployment和Service对象运行起来,我们需要获取管理员密码来完成Jenkins的初始化配置。

```bash
# 查看Jenkins的管理员密码
export POD_NAME=$(kubectl get pods --namespace jenkins -l "app=jenkins" -o jsonpath="{.items[0].metadata.name}")
kubectl exec --namespace jenkins $POD_NAME cat /var/jenkins_home/secrets/initialAdminPassword
```

运行以上命令后,将会输出Jenkins的管理员密码。

#### 步骤六:配置Jenkins凭证
在Jenkins中,凭证(Credentials)用于连接到版本控制系统或其他外部服务。我们需要在Jenkins中配置连接到Kubernetes集群的凭证。

1. 打开Jenkins的管理员页面(http://:8080);
2. 点击"Manage Jenkins",再点击"Manage Credentials";
3. 点击"Global",再点击"Add Credentials";
4. 在"Kind"下拉列表中选择"Kubernetes configuration (kubeconfig)";
5. 输入凭证的相关信息,包括kubeconfig文件的内容、ID和描述;
6. 点击"OK"来保存凭证配置。

现在,Jenkins已经具备连接到Kubernetes集群的凭证。

#### 步骤七:配置Kubernetes插件
为了在Jenkins中使用Kubernetes来构建和部署应用程序,我们需要安装和配置Kubernetes插件。

1. 打开Jenkins的管理员页面(http://:8080);
2. 点击"Manage Jenkins",再点击"Manage Plugins";
3. 在"Available"标签下,搜索"Kubernetes plugin";
4. 勾选"Kubernetes plugin"并点击"Install without restart"来安装插件;
5. 安装完成后,重启Jenkins。

现在,Jenkins已经安装和配置了Kubernetes插件。

#### 步骤八:配置Jenkins主机URL
为了使Jenkins能够正确生成构建和部署的URL,我们需要在Jenkins中配置主机URL。

1. 打开Jenkins的管理员页面(http://:8080);
2. 点击"Manage Jenkins",再点击"Configure System";
3. 找到"Jenkins Location"部分,并在"Jenkins URL"中输入Jenkins主机地址;
4. 点击"Save"来保存配置。

现在,Jenkins已经配置了主机URL。

#### 步骤九:启动Jenkins一次性构建作业
现在,我们可以在Jenkins中创建一次性的构建作业,来验证Jenkins是否能够通过Kubernetes构建和部署应用程序。

1. 打开Jenkins的管理员页面(http://:8080);
2. 点击"New Item"来创建一个新的构建作业;
3. 输入构建作业的名称,并选择"Freestyle project";
4. 在"General"部分,勾选"GitHub project"并输入GitHub仓库的URL;
5. 在"Build"部分,点击"Add build step",选择需要的构建步骤;
6. 在"Post-build Actions"部分,点击"Add post-build action",选择需要的后置构建动作;
7. 点击"Save"来保存构建作业;
8. 点击"Build Now"开始构建作业。

至此,Jenkins已成功部署在Kubernetes集群中,并可以通过Kubernetes插件进行构建和部署。刚入行的小白可以根据这篇文章提供的步骤和代码示例来实现关键词【jenkins部署在k8s中】。祝他在使用Jenkins进行持续集成和持续交付的过程中取得成功!