k8s的集群安装部署我参考了另外一篇博客,链接: link。在这里向原文作者表达感谢。
我在按照博文实操过程中,遇到了一些问题,特此记录一下,也希望能为大家在实操遇到问题时提供一点线索。
原文中提到了禁用swap分区,但是禁用的方式可能不起作用,这里推荐直接编辑etc文件。
vim /etc/fstab
,注释掉swap分区的那一行,然后重启。
原文未提到的一点,这个不禁用的话在部署k8s的时候会有报错提醒。
vim /etc/selinux/config
文件,修改SELINUX的值为disabled。
SELINUX=disabled
修改完后也是需要重启。可以在完成所有服务器准备后再一次性重启。
由于docker的制裁,很多情况下都拉取不到镜像,其他替代docker的如podman目前也是走的docker仓库。所以这个只能是碰运气,有时候能拉取到,有时候拉取不到。不过将自己的阿里云镜像加速地址配置在docker镜像源中可以提高成功率,只要有个阿里云账户就行,每个账户都有一个免费的加速地址,百度自行获取一下。
vim /etc/docker/daemon.json
。然后在该json文件中添加
"exec-opts": ["native.cgroupdriver=systemd"]
。注意json格式,上面提到的镜像地址也是配置在该文件中。这里是需要添加systemd这个配置的,不然后面k8s部署也会报错
我是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
这个我尝试了很多次,均以镜像拉取失败而告终。。。实在不行可以跳过,没有可视化界面也可以。
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
这个因为docker默认使用https去harbor拉取如果没有https支持,则需要修改docker的/etc/docker/daemon.json文件,注意是所有节点的docker都得修改。在daemon.json中添加
{
"insecure-registries": ["你的harbor主机ip:5000"]
}
然后保存重启docker:
systemctl daemon-reload
systemctl restart docker
整个部署流程设计到很多端口,需要注意每个端口的含义得对应上。
首先是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。
如果你在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的插件推荐安装里面没有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最好不要合在一个文件中,不然修改某个属性时可能会影响到其他属性。