kubernetes集群及Jenkins发布

一,k8s集群的安装部署

k8s的集群安装部署我参考了另外一篇博客,链接: link。在这里向原文作者表达感谢。
我在按照博文实操过程中,遇到了一些问题,特此记录一下,也希望能为大家在实操遇到问题时提供一点线索。

二,关于k8s的部署问题及解决

2.1. 安装前服务器的准备工作

禁用swap分区

原文中提到了禁用swap分区,但是禁用的方式可能不起作用,这里推荐直接编辑etc文件。
vim /etc/fstab,注释掉swap分区的那一行,然后重启。

禁用selinux

原文未提到的一点,这个不禁用的话在部署k8s的时候会有报错提醒。
vim /etc/selinux/config 文件,修改SELINUX的值为disabled。

SELINUX=disabled

修改完后也是需要重启。可以在完成所有服务器准备后再一次性重启。

2.2,docker拉取不到镜像

由于docker的制裁,很多情况下都拉取不到镜像,其他替代docker的如podman目前也是走的docker仓库。所以这个只能是碰运气,有时候能拉取到,有时候拉取不到。不过将自己的阿里云镜像加速地址配置在docker镜像源中可以提高成功率,只要有个阿里云账户就行,每个账户都有一个免费的加速地址,百度自行获取一下。

2.3,docker修改参数

vim /etc/docker/daemon.json。然后在该json文件中添加
"exec-opts": ["native.cgroupdriver=systemd"]。注意json格式,上面提到的镜像地址也是配置在该文件中。这里是需要添加systemd这个配置的,不然后面k8s部署也会报错

2.4,calico插件镜像拉取失败

我是3个服务器节点,master拉取成功,2个从节点失败。所以我直接将master的镜像传到node节点,然后docker load。首先在master节点查看已经获取到的镜像,执行命令:

docker images  

然后打包镜像:

 docker save -o 镜像名称:版本号

然后传递到其他节点:

  scp *.tar.gz root@节点ip:/root/

在其他节点执行:

docker load -i 刚刚传递的压缩包

完成后重启:

 systemctl restart kubectl

2.5安装kuboard图形化工具

这个我尝试了很多次,均以镜像拉取失败而告终。。。实在不行可以跳过,没有可视化界面也可以。

2.6 kubectl get nodes 执行错误

node节点执行kubectl命令报错The connection to the server localhost:8080 was refused - did you specify 。
需要从主节点复制admin.conf到从节点环境,然后配置环境变量并刷新。

scp -r [email protected]:/etc/kubernetes/admin.conf /etc/kubernetes/admin.conf

#配置环境变量并刷新
vim /etc/profile
export KUBECONFIG=/etc/kubernetes/admin.conf
#保存退出并执行以下代码使用环境变量生效
source /etc/profile

2.7 k8s拉取harbor镜像错误

这个因为docker默认使用https去harbor拉取如果没有https支持,则需要修改docker的/etc/docker/daemon.json文件,注意是所有节点的docker都得修改。在daemon.json中添加

{
  "insecure-registries": ["你的harbor主机ip:5000"]
}

然后保存重启docker:

 systemctl daemon-reload
  systemctl restart docker

2.8 服务部署的端口问题

整个部署流程设计到很多端口,需要注意每个端口的含义得对应上。
首先是jar包的端口,如果你的server.port=8281,那么在制作镜像的时候,Dockerfile需要暴露的端口应该也是8281,即
EXPOSE 8281;Kubernetes Deployment 配置 containerPort: 8281;Kubernetes Service 配置 targetPort: 8281,而nodePort和port则视情况而定,nodePort是集群外部访问服务的端口,使用nodePort需要指定type: NodePort,例如Kubernetes Service可以这么配置:

apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
  - protocol: TCP
    port: 80  # 服务暴露给 Pod 的端口
    targetPort: 8281  # Pod 内部监听的端口
    nodePort: 31111  # 每个节点上开放的端口

另外,这些文件都可以通过ai直接生成,然后自己改下配置就ok。

2.8 ssh连接集群执行kubectl命令问题

如果你在Jenkins流水线语句中使用了ssh远程连接执行命令,执行的命令需要通过双引号引用:

KUBECONFIG='/etc/kubernetes/admin.conf'
sh 'ssh [email protected] " export KUBECONFIG=${KUBECONFIG} && kubectl apply -f /usr/local/k8s/k8s-deployment.yml"'

如果执行不成功,可以指定KUBECONFIG。
如果ssh连接不成功,需要先在服务器Jenkins的容器内使用ssh连接一次,确认信任连接,只有就可以了。

三,Jenkins

Jenkins的插件推荐安装里面没有pipeline Stage View 这个插件,这个是用来展示流水线每个阶段的视图的,强烈建议安装该插件。Jenkins最主要的是配置jdk和maven。然后制作流水线。流水线的制作我参考了这篇文章 链接: link。文中有些图片和文字描述没有完全对应,有些错位。但是整体流程是ok的。
这里提供一个Jenkinsfile版本:

//所有脚本命令放在pipeline中
pipeline{
	//指定任务哪个集群节点执行
	agent any	
	//声明全局变量,给后面使用
	environment{
		key = 'value'
		//Harbor地址
		harbor_addr = '192.168.115.130:5000'
		//仓库名
		harbor_warehouse = 'test'
		//用户名
		harbor_user = 'admin'
		//密码
		harbor_pwd = '123456'
		//父子工程指定构建的项目名称
		project_name = 'xDataFramework-spring-boot-starter'
		version = '1.0.2'
		KUBECONFIG='/etc/kubernetes/admin.conf'


	}

	stages{
		stage('拉取仓库代码'){
			steps{
				checkout([$class: 'SubversionSCM', additionalCredentials: [], excludedCommitMessages: '', excludedRegions: '', excludedRevprop: '', excludedUsers: '', filterChangelog: false, ignoreDirPropChanges: false, includedRegions: '', locations: [[cancelProcessOnExternalsFail: true, credentialsId: '11b1db60-04ac-49cd-9f76-d884ff7db21e', depthOption: 'infinity', ignoreExternalsOption: true, local: '.', remote: 'https://svnsj.xquant.com/svn/xData/trunk/基础框架/xDataFramework']], quietOperation: true, workspaceUpdater: [$class: 'UpdateUpdater']])
			}
		}
		stage('Maven构建项目'){
			steps{
				sh '/var/jenkins_home/maven/apache-maven-3.9.9/bin/mvn clean package -DskipTests'
				
			}
		}
		
		stage('制作自定义Docker镜像'){
			steps{
				
				sh '''
				mkdir -p docker && mv ./${project_name}/target/*.jar docker
				docker build -t ${JOB_NAME}:${version} docker/'''
			}
		}
		stage('推送镜像到Harbor仓库'){
			steps{
				sh '''docker login -u ${harbor_user} -p ${harbor_pwd} ${harbor_addr}
				docker tag ${JOB_NAME}:${version} ${harbor_addr}/${harbor_warehouse}/${JOB_NAME}:${version}
				docker push ${harbor_addr}/${harbor_warehouse}/${JOB_NAME}:${version}'''
			}
		}
		 stage('修改k8s的yml文件') {
            steps {
                sh 'ssh [email protected] "yq -i \'.spec.template.spec.containers[0].image = \\"${harbor_addr}/${harbor_warehouse}/${JOB_NAME}:${version}\\"\' /usr/local/k8s/k8s-deployment.yml"'
            }
        }
		
		 stage('k8s-master集群部署') {
            steps {
				
                sh 'ssh [email protected] " export KUBECONFIG=${KUBECONFIG} && kubectl apply -f /usr/local/k8s/k8s-deployment.yml"'
                sh 'ssh [email protected] " export KUBECONFIG=${KUBECONFIG} && kubectl apply -f /usr/local/k8s/k8s-service.yml"'
            }
        }
	}
}

因为使用了yq命令修改服务器上的yml文件,所以service.yml和deployment.yml最好不要合在一个文件中,不然修改某个属性时可能会影响到其他属性。

你可能感兴趣的:(kubernetes,jenkins,容器)