一、Docker容器
1、Docker介紹
(1)Docker的介紹
- Docker是一種容器技術。
- 容器是什么-容器是一種輕量級、可移植、自包含的軟件打包技術,使應用程序可以在幾乎任何地方以相同的方式運行。
- 開發在自己筆記本上創建並測試好的容器,無需任何修改就能夠在生產系統的虛擬機、物理服務器或公有雲主機上運行。
(2)Docker的由來
- 容器來源於集裝箱,二者的英文都是Container,集裝箱解決了運輸的難題。
- Docker的中文意思是碼頭工人。
- Docker的圖標是集裝箱。
(3)容器 VS 虛擬機
(4)Docker的特點
- Docker的特點:輕量級、可移植、資源占用少。
- 對於開發人員-Build Once,Run Anywhere。
- 對於運維人員-Configure Once,Run Anything。
2、Docker安裝配置
(1)Docker安裝
- apt-get update
- apt-get install -y docker.io
(2)Docker配置
- 阿里雲加速器配置(https://cr.console.aliyun.com/)
3、Docker基本使用
(1)Docker基本使用
docker pull mysql:5.6
docker run -p 3306:3306 --name mymysql -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
(2)Docker架構
(3)Docker基本概念
- 鏡像(image)、容器(container)、倉庫(registry)。
- 倉庫分公有和私有兩種。Docker hub是默認的倉庫。
docker pull nginx
docker rmi nginx
(4)Docker基本使用
- 版本查看、鏡像拉取、鏡像查詢、鏡像刪除。
- 容器運行、端口映射、掛存儲卷、進入容器、查看容器日志、查詢容器、設置環境變量、容器停止、容器刪除。
- 倉庫登錄。
- 鏡像構建、鏡像打tag、鏡像推送。
- Dockerfile基本語法(FROM、RUN、CMD/ENTRYPOINT、EXPOSE)
docker run -p 3306:3306 --name mymysql -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
docker logs -f ce5307fc90b6
docker ps -a
docker stop ce5307fc90b6
docker rm ce5307fc90b6
docker push myregistry/mymysql:1.0
二、必知必會的K8s
1、k8s介紹
Kubectl cerate -f test.yaml Kubectl apply -f /root/kube.yaml kubectl get services --all-namespaces
- 基於容器技術的分布式架構領先方案。它是google嚴格保密十幾年的秘密武器-Borg的一個開源版本。
- Kubernetes是Google開源的一個容器編排引擎,它支持自動化部署、大規模可伸縮、應用容器化管理。
2、k8s能做什么
- 容器的自動化復制和部署。隨時擴展或收縮容器規模,並提供負載均衡。
- 方便地容器升級。
- 提供容器彈性,如果失效就替換它。
K8s對於測試能做什么
- 測試服務器的集中化、自動化管理。將各種平台的服務器加入集群,按需部署或銷毀。
- 持續集成時方便地自動部署。
k8s架構
k8s基本概念
- Master是主服務器,node是用於部署應用容器的服務器。
- Pod基本操作單元,也是應用運行的載體。整個Kubernetes系統都是圍繞着Pod展開的,比如如何部署運行Pod、如何保證Pod的數量、如何訪問Pod等。
- Deployment定義了pod部署的信息。
- 若干個pod副本組成一個service,對外提供服務。
- 副本是指一個pod的多個實例。
- Namespace用於多租戶的資源隔離。在測試環境中可以根據namespace划分成多套測試環境。默認有2個namespace:kubu-system/default
k8s調度過程
- Kubernetes Client將請求發送給API server。
- API Server根據請求的類型,將處理的結果存入高可用鍵值存儲系統Etcd中。
- Scheduler將未分發的Pod綁定(bind)到可用的Nod節點上,存到etcd中。
- Controller Manager根據etcd中的信息,調用node中的kubelet創建pod。
- Controller Manager監控pod的運行狀況並確保運行正常。
3、k8s的安裝
k8s安裝前的准備
准備ke xue上網。在主機上安裝,並配好服務器(服務器地址、密碼需要自己想辦法哦)
k8s安裝說明
- 2台主機上都要安裝docker。
- 2台主機上都要安裝kubeadm、kubelet和kubectl。
- 2台主機上都要禁用虛擬內存。
k8s安裝以及配置
安裝kubeadm,kubelet和kubectl(一)
apt-get update && apt-get install -y apt-transport-https curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF apt-get update && apt-get install -y kubelet kubeadm kubectl apt-mark hold kubelet kubeadm kubectl
注意:curl如果連不上,則需要設置一下ke xue上網:export http_proxy=10.10.10.94:1087 && export https_proxy=10.10.10.94.1087
操作步驟
在ubuntu主機上:
swapoff -a apt-get install apt-transport-https apt-get install curl
在ubuntu-node主機上:
swappff -a apt-get update apt-get install -y apt-transport-https apt-get install -y curl
4、k8s的設置ke xue上網
vim /etc/apt/source.list.d/kubernetes.list export http_proxy=192.168.0.186:1087 && export https_proxy=192.168.0.186:1087 echo $http_proxy curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb http://apt.kubernetes.io/ kubernetes-xenial main EOF
5、k8s配置
vim apt_proxy_conf
apt-get -c apt_proxy_conf update
apt-get -c apt_proxy_conf install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
安裝kubeadm、kubelet和kubectl(二)
Apt安裝這3個東東時,可能需要FQ。AptFQ安裝使用如下方式:
初始化master(一)
- swapoff -a (禁用虛擬內存)
- kubeadm init --pod-network-cidr=10.244.0.0/16
注意:這一步因為連不上Google的鏡像庫,會導致失敗。記錄下載失敗的鏡像,下一頁中會告訴大家如何處理。
6、k8s初始化master
kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=NumCPU
注意:這一步因為連不上Google的鏡像庫,會導致失敗。記錄下載失敗的鏡像,下一頁中會告訴大家如何處理。
初始化master(二)
- 可以從keveon或mirrorgooglecontainers鏡像庫中下載,當其中一個鏡像庫找不到時,嘗試另外一個。
- 再手工設置tag。
7、k8s安裝和配置
docker pull mirrorgooglecontainers/kube-apiserver:v1.13.2 docker tag mirrorgooglecontainers/kube-apiserver:v1.13.2 k8s.gcr.ioi/kube-apiserver:v1.13.2 docker images | grep kube-apiserver docker rmi mirrorgooglecontainers/kube-apiserver:v1.13.2
docker pull mirrorgooglecontainers/kube-controller-manager:v1.13.2 docker tag mirrorgooglecontainers/kube-controller-manager:v1.13.2 k8s.gcr.ioi/kube-controller-manager:v1.13.2 docker rmi mirrorgooglecontainers/kube-controller-manager:v1.13.2 docker images | grep kube-controller
docker pull mirrorgooglecontainers/kube-scheduler:v1.13.2 docker tag mirrorgooglecontainers/kube-scheduler:v1.13.2 k8s.gcr.ioi/kube-scheduler:v1.13.2 docker rmi mirrorgooglecontainers/kube-scheduler:v1.13.2 docker images | grep kube-scheduler
docker pull mirrorgooglecontainers/kube-proxy:v1.13.2 docker tag mirrorgooglecontainers/kube-proxy:v1.13.2 k8s.gcr.ioi/kube-proxy:v1.13.2 docker rmi mirrorgooglecontainers/kube-proxy:v1.13.2 docker images | grep kube-proxy
docker pull mirrorgooglecontainers/pause:3.1 docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.ioi/pause:3.1 docker rmi mirrorgooglecontainers/pause:3.1 docker images | grep pause
docker pull mirrorgooglecontainers/etcd:3.2.24 docker tag mirrorgooglecontainers/etcd:3.2.24 k8s.gcr.ioi/etcd:3.2.24 docker rmi mirrorgooglecontainers/etcd:3.2.24 docker images | grep etcd
docker pull keveon/coredns:1.2.6 docker tag keveon/coredns:1.2.6 k8s.gcr.ioi/coredns:1.2.6 docker rmi keveon/coredns:1.2.6 docker images | grep coredns
初始化master(三)
- 重新執行kubeadm init --pod-network-cidr=10.244.0.0/16。
- 記錄下最后一條kubeadm join命令。
kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=NumCPU
初始化master(四)
- mkdir -p $HOME/.kube
- sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
- sudo chown $(id -u):$(id -g) $HOME/.kube/config
8、k8s安裝網絡插件
安裝網絡插件(只在master上執行)(一)
- sysctl net.bridge.bridge-nf-call-iptables=1
- curl -O https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml
安裝網絡插件(只在master上執行)(二)
- 修改kube-flannel.ym文件,增加下圖中紅色的部分。
- kubectl apply -f kube-flannel.yml
添加node(只在node上執行)
- 將之前記錄下來的kubeadm join 命令執行。
- swapoff -a
- sysctl net.bridge.bridge-nf-call-iptables=1
k8s檢查安裝配置
- 檢查node是否ready:kubectl get node
- 檢查所有pod是否正常:kubectl get pod --all-namespaces -o wide
9、k8s安裝異常處理
- 在node上執行kubeadm reset可以斷開node,然后重新join。
- 在master上執行kubeadm reset后可以重新init。
- 重新啟動后,要執行如下命令:
- swapoff -a
- systemctl daemon-reload
- systemctl restart kubelet
10、k8s基本使用
k8s基本使用-Deployment創建、刪除
- kubectl create -f test.yaml
- kubectl delete -f test.yaml
k8s基本使用-Service創建及查看
- kubectl create -f test.yaml
- kubectl get service --all-namespaces
k8s基本使用-Pod查看、刪除
- kubectl get pod --all-namespaces -o wide
- kubectl describe pod xxxxxx -n kube-system
- kubectl delete pod xxxxxx -n kube-system
三、持續集成與Jenkins
1、持續集成
- 持續集成(CI)是一種軟件開發實踐。
- 團隊開發成員經常集成他們的工作,每個成員每天至少集成一次。
- 每天可能會發生多次集成。
- 每次集成都通過自動化的構建(包括編譯、打包、部署、自動化測試)來驗證。
- 從而盡早地發現集成錯誤。
持續集成過程
持續集成優勢
- 快速集成、快速反饋、快速解決。
- 團隊信心更強。
- 發布效率更高
2、Jenkins介紹
- 持續集成工具
- 任務調度平台
3、Jenkins安裝以及配置
Jenkins安裝
- jdk安裝以及配置環境變量
- tomcat下載並解壓
- jenkins war包下載,並放到tomcat的app目錄,啟動tomcat。
jenkins服務器安裝
- 安裝git
- 安裝maven
- 修改maven鏡像,使用阿里雲鏡像,修改maven的conf目錄下的settings.xml文件。
jenkins配置
- 瀏覽器訪問Jenkins url:xxx.xxx.xxx.xxx:8080/jenkins
- 按提示創建用戶
- 按提示安裝插件:ssh/publish over ssh/git parameter/Maven Integration
Jenkins配置
- Jenkins全局工具配置,配置jdk/git/maven
四、Jenkins+k8s發布實例
1、Jenkins+k8s發布實例
2、registry安裝配置和使用
Registry安裝配置
- docker pull registry
- docker run -p 5000:5000 -v /home/registry_images:/var/lib/registry -d registry
Registry使用
- 修改/etc/docker/daemon.json文件
- docker pull nginx
- docker tag nginx 10.10.10.71:5000/nginx:test
- docker pull 10.10.10.71:5000/nginx:test
3、Jenkins項目創建與配置
Jenkins項目創建
- 創建maven項目
- 設置參數化構建
- Jenkins項目配置-設置代碼源
當前使用的是github上的一個public項目,你也可以使用
- 設置maven構建命令
- 設置構建后操作,將jar包打包成docker鏡像,並推送registry
注意:對應腳本要放到對應目錄。
4、Jenkins項目構建
Jenkins項目配置
- 設置jenkins服務器到k8s master ssh 免密登錄
- 設置構建后操作,將yaml文件拷貝到k8s master上並運行應用。
Jenkins項目構建-參數化構建
Jenkins查看日志
jenkins訪問驗證
- 瀏覽器訪問任一node的IP加上nodePort。
總結
- Registry安裝配置和使用(使用docker安裝)
- Jenkins項目創建與配置
- Jenkins項目構建
來源:慕課網免費課程地址:http://www.imooc.com/learn/1112