一、安裝docker
另外一篇文章有講docker的安裝與相關配置,暫時就不講了
1、關閉防火墻并修改主機名
hostnamectl set-hostname k8s-master && bash #修改主機名
systemctl stop firewalld
systemctl disable firewalld
2、永久禁用swap
vi /etc/fstab
#驗證是否關閉,swap必須為0
free -g
用#注釋掉swap一行(新版centos已經(jīng)默認禁用)
3、配置鏡像加速
到阿里云獲取自己鏡像加速地址
cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"], ##修改為你的容器加速器地址 登錄阿里云點擊鏡像工具-鏡像加速器
4、安裝 docker-compose
- 官網(wǎng)找到下載地址
https://github.com/docker/compose/releases 版本地址
我的下載地址
wget https://github.com/docker/compose/releases/download/v2.10.0/docker-compose-linux-x86_64
- 下載后移動至/usr/local/bin/文件夾下 (如果移動不了 就手動移動,記住重命名“docker-compose”)
mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
chmod a+x /usr/local/bin/docker-compose
注意 一定要配置掛載 不然磁盤容易滿
- 啟動
./install.sh #記住到harbor目錄中執(zhí)行install.sh
我的harbor下載安裝的時候在home
進入到harbor命令 可以用 統(tǒng)一停止 和啟動所有harbor插件
docker-compose down 關閉
docker-compose up -d 啟動
- 測試打包上傳到鏡像倉庫
現(xiàn)在下載一個鏡像nginx
docker pull nginx
給鏡像打tag
docker tag nginx:latest ip:端口/項目/nginx
上傳鏡像
docker push ip:端口/項目/nginx
#在linux 拉取gitlab的代碼 (尤其在jenkins一定要先通過ssh拉取一次代碼)
git clone sshxxxxxxxxxx地址
5、項目配置
- 項目結構
ums-app 為業(yè)務處理
ums-api 為api接口
因api包依賴到根項目的pom.xml 所以 打包時 需要將根項目打包,(但不打包ums-app)
排除ums-app 則在 ums-app的pom.xml
<maven.deploy.skip>true</maven.deploy.skip>
-
創(chuàng)建Dockerfile
創(chuàng)建的目錄為 app>src>main 因為只構建uniapp
FROM primetoninc/jdk:1.8
LABEL maintainer="wj"
VOLUME /tmp
VOLUME /file
ARG JAR_FILE
RUN echo $JAR_FILE
ADD $JAR_FILE app.jar
RUN sh -c 'touch /app.jar'
EXPOSE 8080
ENV SPRING_PROFILES_ACTIVE=dev
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
- 父項目加載打包插件
<properties>
<docker.repository.releases>192.168.1.8:1180</docker.repository.releases>
<revision>1.0.1-SNAPSHOT</revision>
</properties>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.2</version>
<configuration>
<serverId>docker-releases</serverId>
<registryUrl>http://${docker.repository.releases}</registryUrl>
<pushImage>true</pushImage>
<imageName>${docker.repository.releases}/ums/${project.artifactId}:${revision}</imageName>
<!--<dockerHost>http://172.25.6.11:2375</dockerHost>-->
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<buildArgs>
<active>dev</active>
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
<rm>true</rm>
<!-- 強制添加標簽-->
<forceTags>true</forceTags>
<imageTags>
<imageTag>${revision}</imageTag>
</imageTags>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
- 子項目 ums-app引用
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
</plugin>
二、安裝jenkins
1、拉取jenkins鏡像
docker pull docker.io/jenkins/jenkins
2、創(chuàng)建文件夾
mkdir -p /home/jenkins
3、權限
chmod 777 /home/jenkins
4、啟動
# 注意jdk8的版本 不然可能會
docker run -d -uroot -p 8080:8080 -p 50000:50000 --name jenkins -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker -v /home/jenkins:/var/jenkins -v /home/jenkins_home:/var/jenkins_home -v /etc/localtime:/etc/localtime jenkins/jenkins
5、打開客戶端
http://serverIp:port
6、由于在docker容器 安裝的jenkins 所以需要進入容器查看密碼
進入容器
docker exec -it jenkins bash
查看密碼
cat /var/jenkins_home/secrets/initialAdminPassword
登錄后 安裝推薦插件
插件安裝完成,創(chuàng)建管理員用戶
至此,Jenkins安裝完成!??!
7、因jenkins會拉取gitlab的代碼進行構建,采用ssh的方式則需密鑰,然后jenkins在docker容器中 所以需要進入docker容器生成密鑰
docker exec -it jenkins bash # 進入docker容器
生成密鑰
#注意這里的-m PEM參數(shù),如果沒有的話,會生成較新版本的證書,jsch無法識別,后面無法用于ssh登錄
ssh-keygen -m PEM -t rsa # 輸入后 一直按回車鍵即可
cd ~/.ssh #進入到jenkins里面的.ssh目錄 會看到2個文件 id_rsa id_rsa.pub
id_rsa.pub 為公鑰(放到gitlab中的SSH 密鑰) id_rsa 為私鑰(放到Jenkins憑證)
8、安裝插件
所需的插件:
? Maven插件 Maven Integration plugin
? 發(fā)布插件 Deploy to container Plugin
? SSH連接 Publish Over SSH
安裝過程:
系統(tǒng)管理—>插件管理---->可選插件—>過濾Deploy to container---->勾選—>直接安裝
已安裝好的插件
9、jenkins配置
-
Dashboard>系統(tǒng)管理>Configure System (如果沒有這個配置則需要添加 插件)
同一頁面
Jenkins Location 這列需要配置 公網(wǎng)地址
全局屬性 這列配置環(huán)境變量
配置變量的地址
vi /usr/lib/systemd/system/docker.service
–graph /home/docker docker 掛載目錄 不處理磁盤容器滿了
配置hosts地址
vi /etc/hosts -
Dashboard>系統(tǒng)管理>全局工具配置 (如果沒有這個配置則需要添加 插件)
拉到最下面 我已經(jīng)裝了 所以是應用,沒有裝的情況是 需要新增一個
選擇
maven的版本
名字
進入jenkins 容器配置settings.xml
如執(zhí)行出現(xiàn) 沒有vi命令
#安裝命令
apt-get update
apt-get install vim
cd /var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/maven3.8.6/conf
修改settings.xml
-
配置jenkins的密鑰
密鑰為之前在jenkins生成的,id_rsa 為密鑰 -
創(chuàng)建maven項目
-
BRANCH_ENV 為變量
-
dev、master 對應的分支名,必須一致
圖1:
clean install -DskipTests=true -U docker:build **-D branch_env=${BRANCH_ENV}**
${BRANCH_ENV} jenkins中配置的分支變量 下列圖1:
-D branch_env branch_env 為項目中pom.xml變量 下列圖2:
圖2:
前端構建
記得
插件管理中 安裝nodejs插件 和全局工具配置這里選擇 NodeJs
執(zhí)行的shell命令
cd docker
version=$(date "+%Y%m%d%H%M%S")
npm install
npm run build:$BRANCH_ENV
sh build-$BRANCH_ENV.sh $version
echo $PASSWORD docker login xxx:1180 --username $USERNAME --password-stdin # harbor ip:端口
docker push xxx:1180/html/ums-html-$BRANCH_ENV:$version
三、安裝Harbor私有鏡像倉庫
1、下載harbor
wget https://github.com/goharbor/harbor/releases/download/v2.0.6/harbor-offline-installer-v2.0.6.tgz
2、解壓下載的harbor
tar -zxvf harbor-offline-installer-v2.0.6.tgz
3、配置harbor
修改harbor.yml文件,如果該文件不存在,則從harbor.yml.tmpl復制一下
hostname: 10.1.1.132 ###修改成自己的主機ip,如果在公網(wǎng),則添加能訪問到該主機的域名
http:
port: 1180 ###默認是80端口,可以修改成自己想設置的端口
harbor_admin_password: 123456 ###修改為你要設置的密碼
###并把https注釋掉,不然在安裝的時候會報錯:ERROR:root:Error: The protocol is https but attribute ssl_cert is not set
#https:
#port: 443
#certificate: /your/certificate/path
#private_key: /your/private/key/path
4、配置harbor地址 用于上傳鏡像
[root@master~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"], ##修改為你的容器加速器地址 登錄阿里云點擊鏡像工具-鏡像加速器
"insecure-registries":["10.1.1.132:1180"] ##修改為你的harbor服務器地址和端口
}
5、此時 可以將代碼打包成鏡像 推送到harbor中了
啟動鏡像的命令
docker run -d -p 實際訪問端口:項目端口 192.168.1.8:1180/project/ums-app
-------------------------------------- 到此 整個構建、上傳已經(jīng)完成 -----------------------------------------
四、K8S搭建
- 如果之前有裝過k8s 建議先清理一次
yum remove -y kubelet kubeadm kubectl
kubeadm reset -f
rm -rvf $HOME/.kube
rm -rvf ~/.kube/
rm -rvf /etc/kubernetes/
rm -rvf /etc/systemd/system/kubelet.service.d
rm -rvf /etc/systemd/system/kubelet.service
rm -rvf /usr/bin/kube*
rm -rvf /etc/cni
rm -rvf /opt/cni
rm -rvf /var/lib/etcd
rm -rvf /var/etcd
#殺死運行的容器:
docker kill
#刪除所有容器:
docker rm
#強制刪除所有鏡像:
docker rmi -f
#如果發(fā)現(xiàn)還是清除不掉
ps -ef|grep kubelet
#然后再kill -9 id
- 修改主機名稱 (之前有處理過 可不用管)
hostnamectl set-hostname k8s-master && bash
- 添加主機的ip (之前有處理過 可不用管)
[root@k8s-master /]# cat /etc/hosts
192.168.1.8 k8s-master
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
185.199.108.133 raw.githubusercontent.com
- 關閉防火墻 (之前有處理過 可不用管)
systemctl stop firewalld
systemctl disable firewalld
- 關閉selinux(之前有處理過 可不用管)
setenforce 0
$ sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
- 關閉swap交換區(qū)間(之前有處理過 可不用管)
swapoff -a # 臨時
sed -i 's/.*swap.*/#&/' /etc/fstab # 永久
free -g #驗證,swap必須為0
- 配置 iptables鏈路(之前有處理過 可不用管)
$ cat > /etc/sysctl.d/k8s.conf <<EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 10
EOF
# 即時生效
$ sysctl --system
#同步時間
yum install ntpdate -y
ntpdate time.windows.com
- 添加k8s yum源(之前有處理過 可不用管)
$ cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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
- 安裝kubeadm、kubelet、kubectl
# 安裝版本是v1.21.5
yum -y install kubelet-1.21.5-0 kubectl-1.21.5-0 kubeadm-1.21.5-0
systemctl enable kubelet
- 初始化k8s
kubeadm init \
--apiserver-advertise-address 192.168.1.8 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.21.5 \
--service-cidr 10.96.0.0/12 \
--pod-network-cidr 10.244.0.0/16 \
--ignore-preflight-errors all \
--token-ttl 0
kubernetes-version :kubernetes 程序組件的版本號,盡量與安裝的 kubelet 版本號相同
image-repository :指定要使用的鏡像倉庫 默認: gar.io apiserver-advertise-address
:一般為 Master 節(jié)點用于集群內(nèi)通信的IP地址,填主機的網(wǎng)卡IP地址 10.0.4.16,也可以填 0.0.0.0
(這里我自己填的這個) service-cidr :Service 網(wǎng)絡的地址范圍,其值為 CIDR 格式的網(wǎng)絡地址。默認為
10.96.0.0/12 pod-network-cidr :Pod 網(wǎng)絡的地址范圍,其值為 CIDR 格式的網(wǎng)絡地址。通常 Flannel 的網(wǎng)絡插件默認值為 10.244.0.0/16 ;Calico 插件的默認值為 192.168.0.0/16
執(zhí)行kebeadm時 超時異常
error execution phase upload-config/kubelet: Error writing Crisocket information for the control-plane node: timed out waiting for the condition
執(zhí)行以下語句 然后再執(zhí)行 kubeadm init
swapoff -a && kubeadm reset && systemctl daemon-reload && systemctl restart kubelet && iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
執(zhí)行完成后保存以下信息 便于后續(xù)加入節(jié)點
- 配置kubectl工具
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
- 配置k8s網(wǎng)絡插件
#安裝calico網(wǎng)絡插件
yum install -y ca-certificates
# 獲取 calico.yaml
wget https://docs.projectcalico.org/manifests/calico.yaml
sed -i "s#192\.168\.0\.0/16#10\.244\.0\.0/16#" calico.yaml
kubectl apply -f calico.yaml
#查看結果
kubectl get node
- k8s單機特殊處理
- master節(jié)點污點處理
單集版的k8s安裝后, 無法部署服務。因為默認master不能部署pod,有污點, 需要去掉污點或者新增一個node,我這里是去除污點。
#執(zhí)行后看到有輸出說明有污點 k8s-master 主機名
kubectl describe nodes k8s-master |grep Taints
#執(zhí)行這句就行,就是取消污點 gameble- 污點名帶減號表示刪除
kubectl taint node k8s-master gameble-
- 安裝補全命令包
yum -y install bash-completion
kubectl completion bash
source /usr/share/bash-completion/bash_completion
kubectl completion bash >/etc/profile.d/kubectl.sh
source /etc/profile.d/kubectl.sh
cat >> /root/.bashrc <<EOF
source /etc/profile.d/kubectl.sh
EOF
- 基于k8s單機部署中間服務
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pods,svc
訪問192.168.1.8:32662 nginx是否可以訪問 可訪問 代表正常
五、K8S可視化
1、k8s-dashboard 下載
官網(wǎng)地址
https://github.com/kubernetes/dashboard/releases
注意要下載對應的版本
目前我的k8s版本為v1.21.5
所以需要找到官網(wǎng)地址 支持1.21.5的版本
2、下載并應用文件
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml
如果下載yaml時 出現(xiàn)
The connection to the server raw.githubusercontent.com was refused - did you specify the right host or port?
配置/etc/hosts 解析地址
#編輯并應用這個配置
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
# 搜索/type 修改為type: NodePort
修改完成之后 就有端口了
可以開始訪問 k8s 可視化界面了
https://ip:30029
3、創(chuàng)建dashboard-svc-account.yaml 認證文件
我的認證文件存放在 home/k8s 目錄下
apiVersion: v1
kind: ServiceAccount
metadata:
name: dashboard-admin
namespace: kube-system
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: dashboard-admin
subjects:
- kind: ServiceAccount
name: dashboard-admin
namespace: kube-system
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
4、執(zhí)行認證文件
kubectl apply -f dashboard-svc-account.yaml
#獲取令牌
[root@i-wgt9mh3x ~]# kubectl get secret -n kube-system |grep admin|awk '{print $1}'
dashboard-admin-token-qt2n5
# 上一部的結果輸入到下面
[root@i-wgt9mh3x ~]# kubectl describe secret dashboard-admin-token-qt2n5 -n kube-system|grep '^token'|awk '{print $2}'
# 得到的token值
eyJhbGciOiJSUzI1NiIsImtpZCI6InVsemhnZWtOVFBy ?????????????????
通過token 去登錄
5、登錄進來后,創(chuàng)建命令空間
注意創(chuàng)建的時候選擇創(chuàng)建的命名空間,這樣就會在命名空間里面了。
生產(chǎn)環(huán)境運營的時候 拉取鏡像后 運行docker鏡像 指定環(huán)境變量即可
docker -e “SPRING_PROFILES_ACTIVE=pro”
6、可視化 安裝查看pods 內(nèi)存、CPU 插件
wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.6/components.yaml
修改yaml配置文件的image為國內(nèi)源,否則拉取不到鏡像
image: k8s.gcr.io/metrics-server-amd64:v0.3.6
#改成
image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.6
加入
args:
- --cert-dir=/tmp
- --secure-port=4443
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP
應用
kubectl apply -f components.yaml
#查看cpu 內(nèi)存占用情況
kubectl top po -n kube-system
kubectl top po -n default
kubectl -n kube-system top pod
crictl ps -a // 查看k8s信息
k8s 證書過期后
kubeadm certs check-expiration // 查看證書有效期
kubeadm certs renew all // 重新生成全部證書
kubeadm init phase kubeconfig all // 重新生成配置文件
systemctl restart kubelet // 重啟kubelet
cp /etc/kubernetes/admin.conf ~/.kube/config //替換kubeconfig
k8s 版本不更新 拉取最新的鏡像部署
在deployments 選擇對應的項目 編輯文章來源:http://www.zghlxwxcb.cn/news/detail-479529.html
spec:
containers:
- name: sas
image: 鏡像地址
env:
- name: SPRING_PROFILES_ACTIVE
value: test
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
imagePullPolicy: Always
最后一個 imagePullPolicy: Always文章來源地址http://www.zghlxwxcb.cn/news/detail-479529.html
到了這里,關于docker+k8s+jenkins+harbor持續(xù)集成自動化部署的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!