k8s中手动创建User并认证、授权供jenkins使用

1. 手动创建原因

云环境自带的,一般会自动生成identity,或者用相关命令创建,比如Google的gke,需要创建GSA和KSA,然后用KSA impersonate(模仿)GSA,生成json形式的key文件,就可以用gcloud命令授权使用了,具体可点击此处查看gke的ksa授权详情。
kubeadmin安装的k8s,用户家目录中的 .kube/config 里面保存了客户端访问API Server的密钥相关信息,可以直接copy,二进制安装的不存在,需要手动生成包含user account的kubeconfig,k8s版本1.18,步骤如下:

1.1. 创建useraccount

此处创建的是全局性的用户账户,只是通过认证Authentication,还没有绑定集群角色。
User name为jenkins的用户向名称为kubernetes的k8s发起authentication,关于ca签名认证的原理,这里不在赘述,可参看其他文章。
执行如下脚本生成名称为jenkins.kubeconfig的kubeconfig文件:

cat kubeconfig.sh
		KUBE_APISERVER="https://10.70.128.50:6443"
		# 设置集群参数
		kubectl config set-cluster kubernetes \
		  --certificate-authority=/opt/kubernetes/ssl/ca.pem \
		  --embed-certs=true \
		  --server=${KUBE_APISERVER} \
		  --kubeconfig=jenkins.kubeconfig
		# 设置客户端认证参数
		kubectl config set-credentials jenkins \
		  --client-certificate=/opt/kubernetes/ssl/server.pem \
		  --client-key=/opt/kubernetes/ssl/server-key.pem \
		  --embed-certs=true \
		  --kubeconfig=jenkins.kubeconfig
		# 设置上下文参数
		kubectl config set-context default \
		  --cluster=kubernetes \
		  --user=jenkins \
		  --kubeconfig=jenkins.kubeconfig
		# 设置默认上下文
		kubectl config use-context default --kubeconfig=jenkins.kubeconfig

执行sh kubeconfig.sh 生成名称为jenkins.kubeconfig的kubeconfig文件

1.2. 基于RBAC(基于角色访问控制)的授权Authorization,创建以下集群角色,并绑定上面创建的user:jenkins

cat jenkins_rbac.yml
	kind: ClusterRole
	apiVersion: rbac.authorization.k8s.io/v1
	metadata:
	  name: myclusterrole
	rules:
	- apiGroups: [""]
	  resources: ["pods","services"]
	  verbs: ["get", "watch", "list", "delete", "create", "update"]
	- apiGroups: [""]
	  resources: ["secrets"]
	  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
	- apiGroups: ["extensions", "apps"]
	  resources: ["deployments"]
	  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
	- apiGroups: ["networking.k8s.io"]
	  resources: ["ingresses"]
	  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
	---
	apiVersion: rbac.authorization.k8s.io/v1
	kind: ClusterRoleBinding
	metadata:
	  name: clusterrolebinding-myclusterrole
	roleRef:
	  apiGroup: rbac.authorization.k8s.io
	  kind: ClusterRole
	  name: myclusterrole
	subjects:
	- apiGroup: rbac.authorization.k8s.io
	  kind: User
	  name: jenkins

创建并绑定角色:kubectl apply -f jenkins_rbac.yml
集群权限如上图
注意,下面截图的User,应为jenkins
此处的User应该为Jenkins

2. Jenkins安装Config File Provider插件,将生产的kubeconfig文件粘贴到如下图中Jenkins的位置:

cat jenkins.kubeconfig

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS...
    server: https://10.70.128.50:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: jenkins
  name: default
current-context: default
kind: Config
preferences: {}
users:
- name: jenkins
  user:
    client-certificate-data: LS0tLS...
    client-key-data: LS0tLS1CRUdJT...

config filemanagement
在这里插入图片描述

3. pipeline使用

设置完成,就可以通过在pipeline中configFileProvider([configFile(fileId: "${k8s_auth}", targetLocation: "admin.kubeconfig")])来使用

<think>好的,用户想用GitLab自动部署.NET 8 WebAPI项目,而且不使用JenkinsK8s和Docker,服务器是CentOS7。首先,我得理清楚用户的需求。他们可能希望一个简单直接的部署流程,避免复杂的工具,可能是因为资源有限或者对容器技术不熟悉。 接下来,我得考虑如何在不使用Docker的情况下部署.NET应用。.NET Core支持自包含部署,所以可能需要将应用发布为自包含的可执行文件,然后通过GitLab CI/CD直接复制到服务器上执行。同时,用户用的是CentOS7,需要注意.NET运行时是否安装,或者是否需要自包含发布。 然后,GitLab Runner的配置是关键。用户需要在服务器上安装GitLab Runner,注册到项目中。需要确认Runner的类型,比如shell executor可能更简单,但需要确保环境配置正确。同时,可能需要设置SSH连接,让Runner能够将构建后的文件传输到目标服务器。 另一个要考虑的是自动化步骤。构建阶段需要运行dotnet restore、build、publish,然后通过SCP或者rsync将文件传输到服务器,最后重启服务。可能需要配置服务单元文件,使用systemd来管理应用的运行,这样部署后可以自动重启应用。 还需要考虑环境变量和配置文件的管理,比如appsettings.json是否需要根据不同的环境进行替换。另外,SSL证书的处理,如果应用需要HTTPS,可能需要在部署脚本中配置。 安全问题也不能忽视,比如SSH密钥的管理,如何在GitLab CI/CD中安全地存储服务器的SSH私钥,避免泄露。可能需要使用GitLab的Variables来存储敏感信息。 最后,测试整个流程,确保每个步骤都能正确执行,处理可能出现的错误,比如文件权限问题、服务启动失败等,日志记录以便排查问题。 用户可能没有提到的一些潜在问题包括服务器上的依赖项,比如libicu等.NET运行时的依赖是否安装,或者防火墙设置是否允许外部访问部署后的应用。这些都需要在文档中提及,帮助用户全面解决问题。</think>以下是基于GitLab CI/CD实现.NET 8 WebAPI项目自动部署到CentOS7服务器的完整方案(不使用Docker/K8s/Jenkins): --- ### **1. 环境准备** #### **服务器端配置** ```bash # CentOS7安装.NET 8 SDK sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm sudo yum install dotnet-sdk-8.0 # 安装Web服务器(可选Nginx) sudo yum install nginx sudo systemctl start nginx ``` #### **GitLab Runner安装** ```bash # 添加GitLab官方仓库 curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash # 安装注册Runner sudo yum install gitlab-runner sudo gitlab-runner register ➜ 输入GitLab URL和注册令牌 ➜ 选择执行器类型:shell ``` --- ### **2. 项目配置** #### **创建`.gitlab-ci.yml`文件** ```yaml stages: - build - deploy variables: PROJECT_NAME: "YourWebApiProject" OUTPUT_DIR: "publish-output" SERVER_IP: "192.168.1.100" DEPLOY_PATH: "/var/www/${PROJECT_NAME}" build: stage: build script: - dotnet restore - dotnet build --configuration Release --no-restore - dotnet publish --configuration Release --output ${OUTPUT_DIR} --runtime linux-x64 --self-contained true artifacts: paths: - ${OUTPUT_DIR}/ deploy: stage: deploy script: - echo "正在部署到 ${SERVER_IP}" - ssh user@${SERVER_IP} "sudo mkdir -p ${DEPLOY_PATH} && sudo chmod 755 ${DEPLOY_PATH}" - scp -r ${OUTPUT_DIR}/* user@${SERVER_IP}:${DEPLOY_PATH} - ssh user@${SERVER_IP} "sudo systemctl restart ${PROJECT_NAME}.service" only: - main # 仅主分支触发 ``` --- ### **3. 服务器服务配置** #### **创建systemd服务文件** ```bash sudo vi /etc/systemd/system/YourWebApiProject.service ``` ```ini [Unit] Description=My .NET 8 WebAPI Application [Service] WorkingDirectory=/var/www/YourWebApiProject ExecStart=/var/www/YourWebApiProject/YourWebApiProject --urls "http://*:5000" Restart=always RestartSec=10 SyslogIdentifier=dotnet-webapi User=www-data Environment=ASPNETCORE_ENVIRONMENT=Production [Install] WantedBy=multi-user.target ``` #### **应用配置** ```bash sudo systemctl daemon-reload sudo systemctl enable YourWebApiProject.service sudo firewall-cmd --permanent --add-port=5000/tcp sudo firewall-cmd --reload ``` --- ### **4. 关键安全配置** #### **SSH免密登录** ```bash # 在GitLab Runner服务器生成密钥对 ssh-keygen -t rsa -b 4096 # 复制公钥到目标服务器 ssh-copy-id -i ~/.ssh/id_rsa.pub user@192.168.1.100 # 在GitLab CI/CD变量中添加: # 变量名:SSH_PRIVATE_KEY 变量值:私钥内容(敏感标记) ``` #### **修改`.gitlab-ci.yml`的deploy阶段** ```yaml deploy: before_script: - mkdir -p ~/.ssh - echo "${SSH_PRIVATE_KEY}" > ~/.ssh/id_rsa - chmod 600 ~/.ssh/id_rsa - ssh-keyscan ${SERVER_IP} >> ~/.ssh/known_hosts # 原有脚本保持不变 ``` --- ### **5. 高级配置建议** 1. **环境区分**:通过`environment`关键字实现多环境部署 ```yaml deploy_prod: extends: deploy variables: SERVER_IP: "192.168.1.100" environment: production deploy_staging: extends: deploy variables: SERVER_IP: "192.168.1.101" environment: staging ``` 2. **健康检查**:添加部署后验证 ```yaml - ssh user@${SERVER_IP} "curl -sSf http://localhost:5000/healthcheck > /dev/null" ``` 3. **回滚机制**:通过保留历史版本实现 ```bash # 服务器端创建版本目录 /var/www/YourWebApiProject ├── releases │ ├── 20240101-120000 │ └── 20240102-150000 └── current -> releases/20240102-150000 ``` --- ### **6. 常见问题排查** 1. **权限问题**: ```bash sudo chown -R www-data:www-data /var/www/YourWebApiProject sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/YourWebApiProject(/.*)?" sudo restorecon -Rv /var/www/YourWebApiProject ``` 2. **依赖缺失**: ```bash sudo yum install libicu libunwind openssl-libs ``` 3. **查看服务日志**: ```bash journalctl -u YourWebApiProject.service -f ``` --- 通过此方案可实现:代码推送 → 自动构建 → 直接部署到CentOS7服务器 → 服务自动重启的全流程自动化。建议首次部署时手动执行各步骤验证环境配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值