柚子快報(bào)邀請碼778899分享:運(yùn)維 Devops
柚子快報(bào)邀請碼778899分享:運(yùn)維 Devops
一、devops介紹
軟件開發(fā)最開始是由兩個(gè)團(tuán)隊(duì)組成:
開發(fā)計(jì)劃由開發(fā)團(tuán)隊(duì)從頭開始設(shè)計(jì)和整體系統(tǒng)的搭建,需要系統(tǒng)不停的迭代更新。運(yùn)維團(tuán)隊(duì)將開發(fā)團(tuán)隊(duì)的Code進(jìn)行測試后部署上線,希望系統(tǒng)穩(wěn)定安全運(yùn)行。
這看似兩個(gè)目標(biāo)不同的團(tuán)隊(duì)需要協(xié)同完成一個(gè)軟件的開發(fā)。
在開發(fā)團(tuán)隊(duì)指定好計(jì)劃完成coding后,需要提供到運(yùn)維團(tuán)隊(duì)。
運(yùn)維團(tuán)隊(duì)向開發(fā)團(tuán)隊(duì)反饋需要修復(fù)的BUG以及一些需要返工的任務(wù)。
這時(shí)開發(fā)團(tuán)隊(duì)需要經(jīng)常等待運(yùn)維團(tuán)隊(duì)的反饋,這無疑延長了事件并推遲了整個(gè)軟件開發(fā)的周期。
會(huì)有一種方式,在開發(fā)團(tuán)隊(duì)等待的時(shí)候,讓開發(fā)團(tuán)隊(duì)轉(zhuǎn)移到下一個(gè)項(xiàng)目中,等待運(yùn)維團(tuán)隊(duì)之前的代碼提供反饋。
可是這樣就意味著一個(gè)完整的項(xiàng)目需要一個(gè)更長的周期才能開發(fā)出最終代碼。
基于現(xiàn)在的互聯(lián)網(wǎng)現(xiàn)狀,更推崇敏捷式開發(fā),這樣就導(dǎo)致項(xiàng)目的迭代速度更快,但是由于開發(fā)團(tuán)隊(duì)與運(yùn)維團(tuán)隊(duì)的溝通問題,會(huì)導(dǎo)致新版本上線的時(shí)間成本很高,這又違背的敏捷式開發(fā)的最初的目的。
那么如果讓開發(fā)團(tuán)隊(duì)和運(yùn)維團(tuán)隊(duì)整合到成一個(gè)團(tuán)隊(duì),協(xié)同應(yīng)對一套軟件呢?這就被稱為DevOps。
DevOps,字面意思是Development & Operations的縮寫,就是運(yùn)維&開發(fā)。
雖然字面意思只涉及到了開發(fā)團(tuán)隊(duì)合運(yùn)維團(tuán)隊(duì),其實(shí)QA測試團(tuán)隊(duì)也是參與其中的。
網(wǎng)上可以查看到DevOps的符號(hào)類似于一個(gè)無窮大的符號(hào)
這表明DevOps是一個(gè)不斷提高效率并且持續(xù)不斷工作的過程
DevOps的方式可以讓公司能夠更快地應(yīng)對更新和市場發(fā)展變化,開發(fā)可以快速交付,部署也更加穩(wěn)定。
核心就在于簡化Dev和Ops團(tuán)隊(duì)之間德流程,使整體軟件開發(fā)過程更快速。
整體的軟件開發(fā)流程:
PLAN:開發(fā)團(tuán)隊(duì)根據(jù)客戶的目標(biāo)制定開發(fā)計(jì)劃。CODE:根據(jù)PLAN開始編碼過程,需要將不同版本的代碼存儲(chǔ)在一個(gè)庫中。BUILD:編碼完成后,需要將代碼構(gòu)建并運(yùn)行。TEST:成功構(gòu)建項(xiàng)目后,需要測試代碼是否存在BUG或錯(cuò)誤。DEPLOY:代碼經(jīng)過手動(dòng)測試和自動(dòng)化測試后,認(rèn)定代碼已經(jīng)準(zhǔn)備好部署并且交給運(yùn)維團(tuán)隊(duì)。OPERATE:運(yùn)維團(tuán)隊(duì)將代碼部署到生產(chǎn)環(huán)境中。MONITOR:項(xiàng)目部署上線后,需要持續(xù)的監(jiān)控產(chǎn)品。INTEGRATE:然后將監(jiān)控階段收到的反饋發(fā)送回PLAN階段,整體反復(fù)的流程就是DevOps的核心,即持續(xù)即成,持續(xù)部署。
為了保證整體流程可以高效的完成,各個(gè)階段都有比較常見的工具,如下圖:
這表明DevOps是一個(gè)不斷提高效率并且持續(xù)不斷工作的過程
DevOps的方式可以讓公司能夠更快地應(yīng)對更新和市場發(fā)展變化,開發(fā)可以快速交付,部署也更加穩(wěn)定。
核心就在于簡化Dev和Ops團(tuán)隊(duì)之間德流程,使整體軟件開發(fā)過程更快速。
整體的軟件開發(fā)流程:
PLAN:開發(fā)團(tuán)隊(duì)根據(jù)客戶的目標(biāo)制定開發(fā)計(jì)劃。CODE:根據(jù)PLAN開始編碼過程,需要將不同版本的代碼存儲(chǔ)在一個(gè)庫中。BUILD:編碼完成后,需要將代碼構(gòu)建并運(yùn)行。TEST:成功構(gòu)建項(xiàng)目后,需要測試代碼是否存在BUG或錯(cuò)誤。DEPLOY:代碼經(jīng)過手動(dòng)測試和自動(dòng)化測試后,認(rèn)定代碼已經(jīng)準(zhǔn)備好部署并且交給運(yùn)維團(tuán)隊(duì)。OPERATE:運(yùn)維團(tuán)隊(duì)將代碼部署到生產(chǎn)環(huán)境中。MONITOR:項(xiàng)目部署上線后,需要持續(xù)的監(jiān)控產(chǎn)品。INTEGRATE:然后將監(jiān)控階段收到的反饋發(fā)送回PLAN階段,整體反復(fù)的流程就是DevOps的核心,即持續(xù)即成,持續(xù)部署。
為了保證整體流程可以高效的完成,各個(gè)階段都有比較常見的工具,如下圖:
最終可以給DevOps下一個(gè)定義:DevOps強(qiáng)調(diào)的使是高效組織團(tuán)隊(duì)之間如何通過自動(dòng)化的工具協(xié)作和溝通來完成軟件的生命周期,從而更快,更頻繁的交付更穩(wěn)定的軟件。
二、準(zhǔn)備環(huán)境
1、安裝jdk
本次我們安裝的是JDK11是因?yàn)閖enkins新版本最低要求是11
jdk下載地址:https://download.oracle.com/otn/java/jdk/11.0.24%2B7/21cffd70ff1e41a3a5ef9898f46e442d/jdk-11.0.24_linux-x64_bin.tar.gz
把下載的jdk上傳到服務(wù)器
[root@jenkins ~]# mkdir -p /opt/environment
[root@jenkins ~]# tar -zxvf jdk-11.0.24_linux-x64_bin.tar.gz -C /opt/environment/
配置jdk環(huán)境變量
[root@jenkins ~]# vim /etc/profile
添加到最后
# Set java environment
JAVA_HOME=/opt/environment/jdk-11.0.24
PATH=$PATH:$JAVA_HOME/bin
export JAVA_HOME PATH
[root@jenkins ~]# source /etc/profile
[root@jenkins ~]# java -version
java version "11.0.24" 2024-07-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.24+7-LTS-271)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.24+7-LTS-271, mixed mode)
2、 安裝Maven
# 下載Maven
[root@jenkins ~]# wget https://archive.apache.org/dist/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz
# 解壓Maven
[root@jenkins ~]# tar -zxvf apache-maven-3.8.8-bin.tar.gz -C /opt/environment
# 配置jar包存放位置
[root@jenkins ~]# vim /opt/environment/apache-maven-3.8.8/conf/settings.xml
# 在55行添加
因?yàn)閙aven的默認(rèn)依賴下載地址是國外的maven官方地址,下載依賴的時(shí)候可能下載過慢甚至下載失敗,所以我們需要將下載地址改為國內(nèi)的阿里云地址,找到?mirrors?標(biāo)簽,然后在下面新增一個(gè)?mirror?配置項(xiàng),加入代碼:
# 配置Maven環(huán)境變量
[root@jenkins ~]# vim /etc/profile
文件最后添加
# Set maven environment
MAVEN_HOME=/opt/environment/apache-maven-3.8.8
PATH=$PATH:$MAVEN_HOME/bin
export MAVEN_HOME PATH
生效一下
[root@jenkins ~]# source /etc/profile
?3、安裝docker
# 下載docker的安裝包
wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.7.tgz
[root@jenkins ~]# tar -zxvf docker-20.10.7.tgz
[root@jenkins ~]# mv docker/* /usr/bin
[root@jenkins ~]# rm -rf docker-20.10.7.tgz
[root@jenkins ~]# rm -rf docker
# system管理docker
cat > /usr/lib/systemd/system/docker.service << EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
EOF
配置鏡像地址:不能配置阿里的,我使用的阿里的鏡像加速是不行了
[root@jenkins ~]# mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
]
}
EOF
[root@jenkins ~]# systemctl daemon-reload
[root@jenkins ~]# systemctl start docker && systemctl enable docker
4、安裝git
[root@jenkins ~]# yum -y install git
5、安裝jenkins
這次我準(zhǔn)備的是最新穩(wěn)定版的jenkins下載地址,根據(jù)官方文檔顯示,最新的穩(wěn)定版本支持的最低jdk版本為jdk11,所以這也是之前要安裝jdk11的原因:
# 下載依賴
[root@jenkins ~]# yum install -y fontconfig
# 下載安裝包
[root@jenkins ~]# wget https://mirrors.jenkins.io/redhat-stable/jenkins-2.401.2-1.1.noarch.rpm
# 創(chuàng)建jenkins工作目錄
[root@jenkins ~]# mkdir -p /opt/server/jenkins
[root@jenkins ~]# mv jenkins-2.401.2-1.1.noarch.rpm /opt/server/jenkins/
[root@jenkins ~]# cd /opt/server/jenkins/
[root@jenkins jenkins]# rpm -ivh jenkins-2.401.2-1.1.noarch.rpm
# 修改jenkins的Javahome
vim /usr/lib/systemd/system/jenkins.service
51行
修改啟動(dòng)用戶不然會(huì)有權(quán)限問題
vim /usr/lib/systemd/system/jenkins.service
設(shè)置用戶數(shù)組
[root@jenkins jenkins]# chown -R root:root /var/lib/jenkins/ && chown -R root:root /var/cache/jenkins/ && chown -R root:root /var/log/jenkins/
[root@jenkins jenkins]# systemctl daemon-reload
[root@jenkins jenkins]# systemctl start jenkins
[root@jenkins jenkins]# systemctl enable jenkins
6、初始化jenkins
根據(jù)提示查看密碼
安裝?
安裝完成后我們需要?jiǎng)?chuàng)建第一個(gè)管理員用戶,按照提示填寫內(nèi)容后我們直接點(diǎn)擊保存并完成
然后來到j(luò)enkins主頁
點(diǎn)擊Manage Jenkins然后點(diǎn)擊Plugins,我們需要在安裝一些插件
搜索:
Git ParameterMaven Integration
?設(shè)置jdk
我們繼續(xù)忘下面找找到Maven的配置地方點(diǎn)擊新增Maven
點(diǎn)擊系統(tǒng)配置
選擇環(huán)境變量
應(yīng)用,保存
先點(diǎn)擊應(yīng)用,在點(diǎn)擊保存,到這里就初始化完成了。
7、準(zhǔn)備JAVA項(xiàng)目
注意pom文件的
一定要?jiǎng)h除或者注釋掉
完整的pom文件
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
訪問測試
8、準(zhǔn)備gitlab
GitLab最少4內(nèi)存,4CPU,不然帶不起來
上傳軟件包
# 安裝依賴
[root@gitlab ~]# yum install -y curl policycoreutils openssh-server openssh-clients postfix policycoreutils-python cronie
# 安裝
[root@gitlab ~]# rpm -ivh gitlab-ce-12.0.2-ce.0.el7.x86_64.rpm
# 配置訪問地址
[root@gitlab ~]# vim /etc/gitlab/gitlab.rb
# 修改完重啟gitlab
[root@gitlab ~]# gitlab-ctl reconfigure
?登錄gitlab
日志位置:/var/log/gitlab 可以進(jìn)去查看訪問日志以及報(bào)錯(cuò)日志等,供訪問查看以及異常排查。
gitlab-ctl tail #查看所有日志
gitlab-ctl tail nginx/gitlab_access.log #查看nginx訪問日志
關(guān)閉 gitlab: # gitlab-ctl stop
啟動(dòng) gitlab: # gitlab-ctl start
重啟 gitlab: # gitlab-ctl restart
gitlab 主配置文件:/etc/gitlab/gitlab.rb #可以自定義一些郵件服務(wù)等
日志地址:/var/log/gitlab/ #對應(yīng)各服務(wù)
服務(wù)地址:/var/opt/gitlab/ #對應(yīng)各服務(wù)的主目錄
倉庫地址:/var/opt/gitlab/git-data #記錄項(xiàng)目倉庫等提交信息
9、漢化Gitlab
我們這里安裝的是v12版本的gitlab,下載v12的漢化包(注:版本要對應(yīng))
https://gitlab.com/xhang/gitlab/-/archive/12-0-stable/gitlab-12-0-stable-zh.tar.gz
[root@gitlab ~]# tar -zxvf gitlab-12-0-stable-zh.tar.gz
# 停止gitlab
[root@gitlab ~]# gitlab-ctl stop
# 開始漢化
[root@gitlab ~]# \cp -rf gitlab-12-0-stable-zh/* /opt/gitlab/embedded/service/gitlab-rails/
# 開啟gitlab
[root@gitlab ~]# gitlab-ctl restart
關(guān)閉注冊功能
Save changes
配置郵箱報(bào)警
[root@gitlab ~]# vim /etc/gitlab/gitlab.rb #57行后添加以下內(nèi)容
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.163.com" #SMTP服務(wù)器
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "guoweijiemail@163.com" #郵箱賬號(hào)
gitlab_rails['smtp_password'] = "nihao123" #客戶端授權(quán)碼,注意:此為163郵箱設(shè)置的客戶端授權(quán)碼,授權(quán)碼是用于登錄第三方郵件客戶端的專用密碼。
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['gitlab_email_from'] = '你的郵箱' #發(fā)郵件的郵箱地址
# 重載gitlab
[root@gitlab ~]# gitlab-ctl reconfigure
# 登錄郵件控制臺(tái)
[root@gitlab ~]# gitlab-rails console
Notify.test_email('guoweijiemail@163.com','test','hello world').deliver_now
創(chuàng)建群組
創(chuàng)建一個(gè)用戶
將新建的用戶添加到組里
?去郵箱設(shè)置密碼
用新用戶登錄,并創(chuàng)建項(xiàng)目
?10、用idea項(xiàng)目連接gitlab
在idea的控制臺(tái)
PS D:\Java-code\Devops> git init
PS D:\Java-code\Devops> git remote add origin http://192.168.1.11/guoweijie/devops.git
PS D:\Java-code\Devops> git add --all
PS D:\Java-code\Devops> git config --global user.email "guoweijiemail@163.com"
PS D:\Java-code\Devops> git config --global user.name "guoweijie"
PS D:\Java-code\Devops> git commit -m 'init commit'
PS D:\Java-code\Devops> git push origin master
# 生成密鑰
PS D:\Java-code\Devops> ssh-keygen -t rsa 一路回車
?11、創(chuàng)建dockerfile
首先需要在pom.xml文件中定義jar包的規(guī)范
執(zhí)行package
看到package的名字
?創(chuàng)建dockerfile文件
dockerfile文件
# 使用openjdk11做基礎(chǔ)鏡像
FROM openjdk:11-jre
# 作者
MAINTAINER gwjcloud
# 將可執(zhí)行的jar包放到容器當(dāng)中去
ADD java/Devops.jar app.jar
# 暴露8080端口
EXPOSE 8080
# JVM 調(diào)優(yōu)參數(shù)
ENV JAVA_OPTION="-Dfile.encoding=UTF-8 -XX:+UseParallelGC -XX:+PrintGCDetails -Xloggc:/var/log/devops-example.gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:+DisableExplicitGC"
# JVM 內(nèi)存默認(rèn)值
ENV XMX=128m
ENV MXS=128m
ENV XMN=64m
# 運(yùn)行程序
ENTRYPOINT ["sh", "-c", "java -Djava.security.egd=file:/dev/./urandom -jar -Xmx${XMX} -Xms${MXS} -Xmn${XMN} $JAVA_OPTION /app.jar"]
?12、生成ssh-key
[root@jenkins ~]# git config --global user.name "gwjcloud"
[root@jenkins ~]# git config --global user.email "gwjcloud@163.com"
[root@jenkins ~]# ssh-keygen -t rsa -C "JenkinsServer"
查看公鑰
[root@jenkins ~]# cat .ssh/id_rsa.pub
然后把內(nèi)容配置到gitlab上面
在jenkins服務(wù)器上面測試,是否能免密碼拉取代碼
[root@jenkins ~]# git clone git@192.168.1.11:guoweijie/devops.git
[root@jenkins ~]# ls
anaconda-ks.cfg devops
可以看到?jīng)]問題的
13、創(chuàng)建jenkinsfile
pipeline {
agent any
stages {
stage('Hello') {
steps {
echo 'Hello World'
}
}
}
}
14、創(chuàng)建流水線
參數(shù)化構(gòu)建過程——git參數(shù)
15、提交代碼并打tag
推送并提交
PS D:\Java-code\devops> git tag -a v1.0.0 -m "New Version"
PS D:\Java-code\devops> git push origin v1.0.0
打開gitlab看一下tag
?打開jenkins頁面點(diǎn)擊
Build with Parameters
?看構(gòu)建過程
三、流水線構(gòu)建
切換到我們指定的版本通過maven構(gòu)建項(xiàng)目將構(gòu)建好的maven項(xiàng)目打成Docker鏡像推送Docker鏡像到鏡像倉庫通過遠(yuǎn)程連接部署到Kubernetes上面
1、jenkinsfile切換代碼倉庫到指定版本
最下面找到流水線語法
選擇checkout: Check out from version control
點(diǎn)擊生成流水線腳本會(huì)出現(xiàn)腳本
打開開發(fā)工具Idea,修改Jenkinsfile文件
把上面的改成Checkout From Git
中間的是生成的流水線腳本
2、通過Maven構(gòu)建項(xiàng)目
繼續(xù)使用腳本生成器來生成腳本,按照提示并
選擇:sh: Shell Script
mvn clean package -Dmaven.test.skip
mkdir docker/java
mv target/Devops.jar docker/java
mvn clean
?修改Jenkinsfile
pipeline {
agent any
stages {
stage('Checkout From Git') {
steps {
checkout scmGit(branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'git@192.168.1.11:guoweijie/devops.git']])
}
}
stage('Build By Maven'){
steps {
sh '''mvn clean package -Dmaven.test.skip
mkdir docker/java
mv target/Devops.jar docker/java
mvn clean'''
}
}
}
}
?提交一下代碼
打開Jenkins測試一下
3、使用阿里云鏡像倉庫來構(gòu)建鏡像
首先我們需要將Docker倉庫準(zhǔn)備好,來到阿里云新建一個(gè)倉庫,選擇個(gè)人實(shí)例
?創(chuàng)建命名空間
創(chuàng)建鏡像倉庫
?創(chuàng)建RAM用戶來使容器鏡像服務(wù)
添加權(quán)限
使用RAM賬戶登錄阿里云,并開通容器鏡像服務(wù)
在jenkins服務(wù)器上面執(zhí)行登錄阿里云的docker Registry
繼續(xù)使用jenkins的腳本生成器來生成腳本
cd docker
docker build -t registry.cn-hangzhou.aliyuncs.com/devops-gwjcloud/devops-example:${tag}
rm -rf java
在Jenkinsfile中新增一個(gè)階段Build By Docker 將生成的腳本復(fù)制進(jìn)去
pipeline {
agent any
stages {
stage('Checkout From Git') {
steps {
checkout scmGit(branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'git@192.168.1.11:guoweijie/devops.git']])
}
}
stage('Build By Maven'){
steps {
sh '''mvn clean package -Dmaven.test.skip
mkdir docker/java
mv target/Devops.jar docker/java
mvn clean'''
}
}
stage('Build By Docker'){
steps {
sh '''cd docker
docker build -t registry.cn-hangzhou.aliyuncs.com/devops-gwjcloud/devops-example:${tag} .
rm -rf java'''
}
}
}
}
提交代碼略
用find找到pip腳本創(chuàng)建的java目錄,把他刪除,不然會(huì)報(bào)錯(cuò)的
開始jenkins構(gòu)建
可以看到logs有鏡像生成
jenkins服務(wù)器查看鏡像
?4、將鏡像推送到阿里云倉庫
docker push registry.cn-hangzhou.aliyuncs.com/devops-gwjcloud/devops-example:${tag}
docker rmi -f registry.cn-hangzhou.aliyuncs.com/devops-gwjcloud/devops-example:${tag}
在jenkins服務(wù)中添加
推送gitlab略
刪除鏡像
?記得在jenkins服務(wù)器上登錄
?再次構(gòu)建
?四、準(zhǔn)備kubernetes集群
1、服務(wù)器列表
服務(wù)器名稱 IP地址 配置 用途 k8s-master 192.168.1.20 2c2g20g 主節(jié)點(diǎn) k8s-node01 192.168.1.21 2c2g20g 工作節(jié)點(diǎn)1 k8s-node02 192.168.1.22 2c2g20g 工作節(jié)點(diǎn)2
關(guān)閉防火墻,selinux略
?2、同步時(shí)間(all服務(wù)器)
[root@k8s-master ~]# yum -y install chrony
[root@k8s-master ~]# systemctl enable --now chronyd
[root@k8s-master ~]# vim /etc/chrony.conf
1 # Use public servers from the pool.ntp.org project.
2 # Please consider joining the pool (http://www.pool.ntp.org/join.html).
3 #server 0.centos.pool.ntp.org iburst
4 #server 1.centos.pool.ntp.org iburst
5 #server 2.centos.pool.ntp.org iburst
6 #server 3.centos.pool.ntp.org iburst
7 server ntp1.aliyun.com iburst
[root@k8s-master ~]# systemctl restart chronyd
3、關(guān)閉swap分區(qū)和添加主機(jī)映射
[root@k8s-master ~]# swapoff -a
[root@k8s-master ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab
[root@k8s-master ~]# vim /etc/hosts
192.168.1.20 k8s-master
192.168.1.21 k8s-worker01
192.168.1.22 k8s-worker02
4、加載br_netfilter模塊(all)
由于開啟內(nèi)核 ipv4 轉(zhuǎn)發(fā)需要加載 br_netfilter 模塊,所以加載下該模塊,但是這個(gè)模塊不會(huì)默認(rèn)加載,所以我們開啟后還要設(shè)置開機(jī)自動(dòng)加載這個(gè)模塊
# 設(shè)置開機(jī)自動(dòng)加載這個(gè)模塊
cat >> /etc/rc.d/rc.local << EOF
/usr/sbin/modprobe br_netfilter
EOF
chmod +x /etc/rc.d/rc.local
# 立刻加載
modprobe br_netfilter
5、橋接的ipv4流量傳遞給iptables(all)
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
6、安裝ipset和ipvsadm(all)
請求多的時(shí)候可能會(huì)導(dǎo)致響應(yīng)過慢,安裝這兩個(gè)軟件能夠在一定程度上提升ipvs轉(zhuǎn)發(fā)速度
[root@k8s-master ~]# yum install -y ipset ipvsadm
cat > /etc/sysconfig/modules/ipvs.modules << EOF
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
7、安裝containerd(all)
下載地址:https://github.com/containerd/containerd/releases/download/v1.6.21/cri-containerd-cni-1.6.21-linux-amd64.tar.gz
上傳到每臺(tái)服務(wù)器上的/usr/local/src/下面
解壓
[root@k8s-master src]# tar -zxvf cri-containerd-cni-1.6.21-linux-amd64.tar.gz -C /
查看版本號(hào):[root@k8s-master src]# containerd -version
# 生成配置文件
[root@k8s-master ~]# mkdir /etc/containerd
[root@k8s-master ~]# containerd config default > /etc/containerd/config.toml
配置文件(/etc/containerd/config.toml)需要將?sandbox_image?的版本號(hào)改一下版本號(hào)和鏡像地址,因?yàn)槟J(rèn)的鏡像地址是在谷歌上的,谷歌國內(nèi)訪問不到
默認(rèn)值:sandbox_image = “registry.k8s.io/pause:3.6”
目標(biāo)值:sandbox_image = “registry.aliyuncs.com/google_containers/pause:3.9”
啟動(dòng)并設(shè)置為開機(jī)自啟動(dòng)
[root@k8s-master ~]# systemctl enable --now containerd
8、安裝runc(all)
containerd自帶有runc,但是自帶的有些問題,所以我們還需要特意安裝一遍穩(wěn)定版的runc
[root@k8s-master ~]# runc
runc: symbol lookup error: runc: undefined symbol: seccomp_notify_respond
需要下載gperf,因?yàn)樽约旱姆?wù)器yum下不到這個(gè)包所以要使用這種方法;看文檔:【騰訊文檔】自制repo包
使用騰訊云或者阿里云的服務(wù)器
騰訊文檔
使用yum指定安裝
[root@k8s-master ~]# yum -y install gperf/gperf-3.0.4-8.el7.x86_64.rpm
下載libseccomp地址:
https://github.com/opencontainers/runc/releases/download/v1.1.7/libseccomp-2.5.4.tar.gz
/usr/local/src下面
[root@k8s-master src]# tar -zxvf libseccomp-2.5.4.tar.gz
[root@k8s-master src]# yum install -y gcc gcc-c++
[root@k8s-master src]# cd libseccomp-2.5.4
[root@k8s-master libseccomp-2.5.4]# ./configure
[root@k8s-master libseccomp-2.5.4]# make && make install
查看是否安裝成功
下載runc
地址:https://github.com/opencontainers/runc/releases/download/v1.1.7/runc.amd64
到:/usr/local/src下面
[root@k8s-master src]# rm -rf /usr/local/sbin/runc
[root@k8s-master src]# chmod +x runc.amd64
[root@k8s-master src]# mv runc.amd64 /usr/local/sbin/runc
?9、安裝k8s(all)
配置k8s的yum源
cat <
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
#安裝阿里源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
#安裝epel源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
#清除緩存并生成新的緩存
yum clean all && yum makecache
[root@k8s-master ~]# yum install -y kubeadm-1.26.5 kubectl-1.26.5 kubelet-1.26.5
[root@k8s-master ~]# systemctl enable kubelet
10、配置Cgroup啟動(dòng)更改為systemd(all)
[root@k8s-master ~]# sed -i 's/KUBELET_EXTRA_ARGS=/KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"/g' /etc/sysconfig/kubelet
11、初始化集群(master節(jié)點(diǎn))
下載離線鏡像
鏈接:https://pan.baidu.com/s/1-ILbg0GG8jNHQhVaVhUKww?pwd=kfe2
提取碼:kfe2
上傳到master服務(wù)器
解壓
[root@k8s-master ~]# tar -zxvf k8s-image.tar.gz
需要使用文件傳輸命令把?k8s-node.tar.gz?傳輸?shù)剿械膎ode上:
如果沒有這個(gè)命令空間需要?jiǎng)?chuàng)建all服務(wù)器
[root@k8s-master ~]# ctr ns create k8s.io
master導(dǎo)入鏡像
[root@k8s-master ~]# ctr -n k8s.io image import k8s-master.tar.gz
worker導(dǎo)入鏡像
[root@k8s-worker01 ~]# ctr -n k8s.io image import k8s-node.tar.gz
master初始化
[root@k8s-master ~]# kubeadm init --apiserver-advertise-address=192.168.1.20 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.26.5 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
?12、工作節(jié)點(diǎn)加入集群(worker01,worker02)
遠(yuǎn)程執(zhí)行的代碼需要改一下,需要加上?--cri-socket=unix:///var/run/containerd/containerd.sock所以執(zhí)行:
[root@k8s-worker02 ~]# kubeadm join 192.168.1.20:6443 --token swhy5s.uckong39hcyfuz59 --discovery-token-ca-cert-hash sha256:71717f742f2a48e1efb05bdbd48c3f65a26d3a223def2e529149ff1776230fa0 --cri-socket=unix:///var/run/containerd/containerd.sock
設(shè)置開機(jī)自啟動(dòng)
[root@k8s-master ~]# systemctl enable --now kubelet
13、安裝Calico網(wǎng)絡(luò)插件(master)
[root@k8s-master ~]# kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/tigera-operator.yaml
安裝Calico
cat <
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
name: default
spec:
calicoNetwork:
ipPools:
- blockSize: 26
cidr: 10.244.0.0/16
encapsulation: VXLANCrossSubnet
natOutgoing: Enabled
nodeSelector: all()
---
apiVersion: operator.tigera.io/v1
kind: APIServer
metadata:
name: default
spec: {}
EOF
[root@k8s-master ~]# kubectl create -f custom-resources.yaml
14、安裝MetaILB負(fù)載均衡器(master)
metallb是用于kubernetes的Service暴露LoadBalancer的負(fù)載均衡器
kubectl edit configmap -n kube-system kube-proxy
root@k8s-master ~]# kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.9/config/manifests/metallb-native.yaml
五、部署到kubernetes
1、嘗試手動(dòng)部署
首先我們使用yaml的方式部署到kubernetes,先創(chuàng)建一個(gè)secret保存Docker的登陸信息:
# 注意修改自己對應(yīng)的信息
[root@k8s-master ~]# kubectl create secret docker-registry devops-secret --docker-server='registry.cn-hangzhou.aliyuncs.com' --docker-username='devops@1013754841765121' --docker-password='Aq123456' --docker-email='guoweijiemail@163.com' --dry-run -o yaml >> deploy-devops.yaml
然后我們再生成一個(gè)Deployment部署這個(gè)java程序,生成之前需要現(xiàn)在deploy-devops.yaml后面加上?---,因?yàn)樾枰珠_兩段yaml,如圖:
# 生成yaml文件 注意替換自己的信息
[root@k8s-master ~]# kubectl create deployment devops-example --image=registry.cn-hangzhou.aliyuncs.com/devops-gwjcloud/devops-example:v1.0.0 --replicas=1 --port=8080 --dry-run -o yaml >> deploy-devops.yaml
在yaml文件中添加自己的secret信息
[root@k8s-master ~]# kubectl apply -f deploy-devops.yaml
[root@k8s-master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
devops-example-56f7597746-kh2tn 1/1 Running 0 6m5s 10.244.79.82 k8s-worker01
[root@k8s-master ~]# curl 10.244.79.82:/devops
curl: (7) Failed connect to 10.244.79.82:80; Connection refused
[root@k8s-master ~]# curl 10.244.79.82:8080/devops
Hello DevOps --- V1.0.0[root@k8s-master ~]#
接下來暴漏端口給外部訪問,也是生成yaml文件
[root@k8s-master ~]# vim deploy-devops.yaml
[root@k8s-master ~]# kubectl expose deployment devops-example --name=devops-example-svc --port=8080 --target-port=8080 --type=NodePort -o yaml --dry-run >> deploy-devops.yaml
執(zhí)行這個(gè)yaml文件
[root@k8s-master ~]# kubectl apply -f deploy-devops.yaml
通過這個(gè)端口,集群的任意一個(gè)節(jié)點(diǎn)加端口都可以訪問
?2、jenkins自動(dòng)完成kubernetes部署
需要在Jenkins上面新安裝一個(gè)插件
publish over ssh
配置遠(yuǎn)程服務(wù)器
應(yīng)用保存
重啟jenkins
[root@jenkins ~]# systemctl restart jenkins
使用流水線腳本來配置
kubectl set image deployment devops-example devops-example=registry.cn-hangzhou.aliyuncs.com/devops-gwjcloud/devops-example:${tag} --record
把生成的流水線腳本放到j(luò)enkinsfile文件中
推送并提交
測試修改代碼并通過流水線構(gòu)建
提交到gitlab
打標(biāo)簽并推送
PS D:\Java-code\devops> git tag -a v1.1.0 -m 'Version v1.1.0'
PS D:\Java-code\devops> git push origin v1.1.0
成功
可以看到鏡像切換完成
訪問測試
點(diǎn)擊v1.0.0構(gòu)建看看會(huì)發(fā)生什么
成功回退
要注意的是:jenkins是根據(jù)tag之前的代碼來進(jìn)行拉取的,如果你剛剛打完tag,后提交的代碼是不會(huì)生效的。要重新打tag版本,在次構(gòu)建才會(huì)生效!
柚子快報(bào)邀請碼778899分享:運(yùn)維 Devops
文章鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。