kubernete部署安裝(docker方式)
kubernete簡介
Kubernetes是容器集羣管理系統,可以實現容器集羣的自動化部署、自動擴縮容、維護等功能。
優點:
- 快速部署應用
- 快速擴展應用
- 無縫對接新的應用功能
- 節省資源,優化硬件資源的使用
生產上的作用:
- 多個進程(作爲容器運行)協同工作。(Pod)
- 存儲系統掛載
- Distributing secrets
- 應用健康檢測
- 應用實例的複製
- Pod自動伸縮/擴展
- Naming and discovering
- 負載均衡
- 滾動更新
- 資源監控
- 日誌訪問
- 調試應用程序
- 提供認證和授權
下載安裝
測試環境
service | 配置 | 系統 | 節點 |
---|---|---|---|
devops1 | 4核8g | centos | node |
devops2 | 4核8g | centos | master |
docker安裝
Docker version 17.09.0-ce
配置docker-ce的安裝源
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
安裝
yum install docker-ce
查看版本,安裝成功
[root@devops1 ~]# docker -v
Docker version 17.09.0-ce, build afdb6d4
kubernete安裝
配置kubernete阿里雲的yum源
vi /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
安裝kubelet kubeadm kubectl
yum install -y docker kubelet kubeadm kubectl --disableexcludes=kubernetes
kubelet設爲開機啓動
systemctl enable kubelet
master所需鏡像拉取(node不用)
先查看鏡像版本https://hub.docker.com/
- mirrorgooglecontainers/kube-apiserver
- mirrorgooglecontainers/kube-controller-manager
- mirrorgooglecontainers/kube-scheduler
- mirrorgooglecontainers/kube-proxy
- mirrorgooglecontainers/pause
- mirrorgooglecontainers/etcd
- coredns/coredns
docker pull mirrorgooglecontainers/kube-apiserver:v1.16.1-beta.0
docker pull mirrorgooglecontainers/kube-controller-manager:v1.15.3
docker pull mirrorgooglecontainers/kube-scheduler:v1.16.0-beta.1
docker pull mirrorgooglecontainers/kube-proxy:v1.16.0-rc.2
docker pull mirrorgooglecontainers/pause:3.1
docker pull mirrorgooglecontainers/etcd:3.3.17-0
docker pull coredns/coredns:1.6.5
把鏡像脩名字版本修改爲kubernete所需要的
不知道所需要什麼版本,先執行kubeadm init ***命令,會提示所需版本
docker tag mirrorgooglecontainers/kube-apiserver:v1.16.1-beta.0 k8s.gcr.io/kube-apiserver:v1.16.0
docker tag mirrorgooglecontainers/kube-controller-manager:v1.15.3 k8s.gcr.io/kube-controller-manager:v1.16.0
docker tag mirrorgooglecontainers/kube-scheduler:v1.16.0-beta.1 k8s.gcr.io/kube-scheduler:v1.16.0
docker tag mirrorgooglecontainers/kube-proxy:v1.16.0-rc.2 k8s.gcr.io/kube-proxy:v1.16.0
docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
docker tag mirrorgooglecontainers/etcd:3.3.17-0 k8s.gcr.io/etcd:3.3.17-0
docker tag coredns/coredns:1.6.5 k8s.gcr.io/coredns:1.6.5
刪除原鏡像
docker rmi mirrorgooglecontainers/kube-apiserver:v1.16.1-beta.0
docker rmi mirrorgooglecontainers/kube-controller-manager:v1.15.3
docker rmi mirrorgooglecontainers/kube-scheduler:v1.16.0-beta.1
docker rmi mirrorgooglecontainers/kube-proxy:v1.16.0-rc.2
docker rmi mirrorgooglecontainers/pause:3.1
docker rmi mirrorgooglecontainers/etcd:3.3.17-0
docker rmi coredns/coredns:1.6.5
初始化master環境
kubeadm init --kubernetes-version v1.16.0 --pod-network-cidr 10.244.0.0/16 --ignore-preflight-errors=all
# --kubernetes-version: 用於指定 k8s版本
# --pod-network-cidr:用於指定Pod的網絡範圍。
# --ignore-preflight-errors:忽略報錯
初始化成功後,跟據提示添加配置
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
記錄token(node服務器執行,node添加到master中
)
kubeadm join 121.196.246.30:6443 --token 9pcze6.5i52boymmfau3cej --discovery-token-ca-cert-hash sha256:c74f8feade9fc343647eb3f1a4f040b32b57f3cd9d9989615ffad35ab0494ec4
開啓master創建pod功能(默認情況下master是不允許創建pod的)
kubectl taint nodes --all node-role.kubernetes.io/master-
安裝網絡插件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
查看master是否部署成功
kubectl get nodes
狀態爲Ready表示成功
如果爲NoReady,去查看哪些pod失敗
kubectl get pod -A
Running狀態爲成功,kubectl describe pod kube-proxy-pg69r -n kube-system
查看失敗原因,解決後刪除podkubectl delete pod PodName -n kube-system
就可以了
node環境部署
docker和kubernete安裝完成後執行master生成的join命令就行了(默認token失效時間爲24個小時,join沒反應可以在master上創建個新token試試kubeadm token create
, 查看CA token openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
,再join就可以了)
kubeadm join 121.196.246.30:6443 --token 9pcze6.5i52boymmfau3cej --discovery-token-ca-cert-hash sha256:c74f8feade9fc343647eb3f1a4f040b32b57f3cd9d9989615ffad35ab0494ec4
master 上執行kubectl get nodes
驗證是否加入成功
[root@devops2 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
devops2 Ready master 4d23h v1.16.3
devops1 Ready <none> 3d4h v1.16.3
測試集羣部署
kubectl apply -f demo.yaml
查看是否成功
pod配置解析
# yaml格式的pod定義文件完整內容:
apiVersion: v1 #必選,版本號,例如v1
kind: Pod #必選,Pod
metadata: #必選,元數據
name: string #必選,Pod名稱
namespace: string #必選,Pod所屬的命名空間
labels: #自定義標籤
- name: string #自定義標籤名字
annotations: #自定義註釋列表
- name: string
spec: #必選,Pod中容器的詳細定義
containers: #必選,Pod中容器列表
- name: string #必選,容器名稱
image: string #必選,容器的鏡像名稱
imagePullPolicy: [Always | Never | IfNotPresent] #獲取鏡像的策略 Alawys表示下載鏡像 IfnotPresent表示優先使用本地鏡像,否則下載鏡像,Nerver表示僅使用本地鏡像
command: [string] #容器的啓動命令列表,如不指定,使用打包時使用的啓動命令
args: [string] #容器的啓動命令參數列表
workingDir: string #容器的工作目錄
volumeMounts: #掛載到容器內部的存儲卷配置
- name: string #引用pod定義的共享存儲卷的名稱,需用volumes[]部分定義的的卷名
mountPath: string #存儲卷在容器內mount的絕對路徑,應少於512字符
readOnly: boolean #是否爲只讀模式
ports: #需要暴露的端口庫號列表
- name: string #端口號名稱
containerPort: int #容器需要監聽的端口號
hostPort: int #容器所在主機需要監聽的端口號,默認與Container相同
protocol: string #端口協議,支持TCP和UDP,默認TCP
env: #容器運行前需設置的環境變量列表
- name: string #環境變量名稱
value: string #環境變量的值
resources: #資源限制和請求的設置
limits: #資源限制的設置
cpu: string #Cpu的限制,單位爲core數,將用於docker run --cpu-shares參數
memory: string #內存限制,單位可以爲Mib/Gib,將用於docker run --memory參數
requests: #資源請求的設置
cpu: string #Cpu請求,容器啓動的初始可用數量
memory: string #內存清楚,容器啓動的初始可用數量
livenessProbe: #對Pod內個容器健康檢查的設置,當探測無響應幾次後將自動重啓該容器,檢查方法有exec、httpGet和tcpSocket,對一個容器只需設置其中一種方法即可
exec: #對Pod容器內檢查方式設置爲exec方式
command: [string] #exec方式需要制定的命令或腳本
httpGet: #對Pod內個容器健康檢查方法設置爲HttpGet,需要制定Path、port
path: string
port: number
host: string
scheme: string
HttpHeaders:
- name: string
value: string
tcpSocket: #對Pod內個容器健康檢查方式設置爲tcpSocket方式
port: number
initialDelaySeconds: 0 #容器啓動完成後首次探測的時間,單位爲秒
timeoutSeconds: 0 #對容器健康檢查探測等待響應的超時時間,單位秒,默認1秒
periodSeconds: 0 #對容器監控檢查的定期探測時間設置,單位秒,默認10秒一次
successThreshold: 0
failureThreshold: 0
securityContext:
privileged: false
restartPolicy: [Always | Never | OnFailure] #Pod的重啓策略,Always表示一旦不管以何種方式終止運行,kubelet都將重啓,OnFailure表示只有Pod以非0退出碼退出才重啓,Nerver表示不再重啓該Pod
nodeSelector: obeject #設置NodeSelector表示將該Pod調度到包含這個label的node上,以key:value的格式指定
imagePullSecrets: #Pull鏡像時使用的secret名稱,以key:secretkey格式指定
- name: string
hostNetwork: false #是否使用主機網絡模式,默認爲false,如果設置爲true,表示使用宿主機網絡
volumes: #在該pod上定義共享存儲卷列表
- name: string #共享存儲卷名稱 (volumes類型有很多種)
emptyDir: {} #類型爲emtyDir的存儲卷,與Pod同生命週期的一個臨時目錄。爲空值
hostPath: string #類型爲hostPath的存儲卷,表示掛載Pod所在宿主機的目錄
path: string #Pod所在宿主機的目錄,將被用於同期中mount的目錄
secret: #類型爲secret的存儲卷,掛載集羣與定義的secre對象到容器內部
scretname: string
items:
- key: string
path: string
configMap: #類型爲configMap的存儲卷,掛載預定義的configMap對象到容器內部
name: string
items:
- key: string
path: string