Kubernetes学习
發展歷史
Infrastructure as a Service 阿里云
platform as a Service 新浪云
Software as Service Office365
資源管理器
- Apache MESOS 分布式的資源管理框架 2019-05 最大使用廠商Twitter不在使用,改為Kubernetes
- Docker Swarm 與Docker綁定 2019-07 阿里云宣布Docker Swarm 從阿里選擇列表里剔除
- Kubernetes Google 2014年創建管理的,是Google 10多年大規模容器管理技術Borg的開源版本
Kerbernetes是什么
??Kubernetes是容器集群管理系統,是一個開源的平臺,可以實現容器集群的自動化部署、自動擴縮容、維護等功能。
Kubernetes特點
- 可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)
- 可擴展: 模塊化, 插件化, 可掛載, 可組合
- 自動化: 自動部署,自動重啟,自動復制,自動伸縮/擴展
- 輕量級: 消耗資源小
- 負載均衡: IPVS
Kubernetes組件說明
Borg架構
k8s架構
Master組件
- etcd
??etcd的官方將它定位 成一個可信賴的分布式鍵值存儲服務. etcd是Kubernetes提供默認的存儲系統,它能夠為整個分布式集群存儲一些關鍵數據,協助分布式集群的正常運轉.
- scheduler
??負責資源的調度,監視新創建沒有分配到Node的Pod,為Pod選擇一個Node. - controller manager
??負責維護集群的狀態,比如故障檢測、自動擴展、滾動更新等. - api server
??提供了資源操作的唯一入口,并提供認證、授權、訪問控制、API注冊和發現等機制.
Node組件
- kubelet
??負責維護容器的生命周期,同時也負責Volume(CVI)和網絡(CNI)的管理. - kube-proxy
??負責為Service提供cluster內部的服務發現和負載均衡. - **Container **
??runtime負責鏡像管理以及Pod和容器的真正運行(CRI).
其它插件說明
- DNS
??負責為整個集群提供DNS服務. - Dashboard
??提供GUI. - Ingress Controller
??為服務提供外網入口. - Federation
??提供跨可用區的集群.
搭建k8s集群
前置知識點
??目前生產部署Kubernetes集群主要有兩種方式:
??Kubeadm是一個k8s部署工具,提供kubeadm init 和 kubeadm join ,用于快速部署Kubernetes集群.
官方地址: https://kubernetes.io/docs/reference/setup-tools/kubeadm/
??從github上下載發行版的二進制包,手動部署每個組件,組成Kubernetes集群.
??Kubeadm降低部署門檻,但屏蔽了很多細節,遇到問題很難排查.如果想更容易可控,推薦使用二進制包部署Kubernetes集群,雖然手動部署麻煩點,期間可以學習很多工作原理,也利于后期維護.
kubeadm 部署方式介紹
??kubeadm是官方社區推出的一款用于快速部署Kubernetes集群的工具,這個工具能夠通過兩條指令完成一個Kubernetes集群的部署.
- 創建一個Master節點 kubeadm init
- 將Node節點加入到當前集群中 kubeadm join <Master節點的IP和端口>
安裝要求
在開始之前,部署Kubernetes集群集群需要滿足以下幾個條件:
- 一臺或多臺機器, 操作系統Centos7.x
- 硬件配置:2核4G或更高配置
- 集群中所有機器之間網絡互通
- 可以訪問外網,需要拉去鏡像
- 禁止swap分區
環境準備
關閉防火墻
systemctl stop firewalld systemctl disable firewalld關閉selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久 setenforce 0 # 臨時關閉swap
sudo sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久 sudo swapoff -a # 臨時根據規劃設置主機名
# 設置 hostnamectl set-hostname <hostname> # 查看 hostname分別為:
hostnamectl set-hostname master1
hostnamectl set-hostname node1
hostnamectl set-hostname node2
在 master 添加 hosts
cat >> /etc/hosts << EOF 120.25.169.231 master1 120.24.221.223 node1 120.25.205.141 node2 EOF將橋接的IPv4流量傳遞到iptables的鏈
cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOFsysctl --system # 生效時間同步
yum install ntpdate -y #yum更新ntpdate ntp1.aliyun.com #時間同步所有節點安裝Docker/kubeadm/kubelet
??Kubernetes默認 CRI(容器運行時)為Docker,因此先安裝Docker。
安裝Docker
# centos wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo yum -y install docker-ce-18.06.1.ce-3.el7 systemctl enable docker && systemctl start docker docker --version #Docker version 18.06.1-ce, build e68fc7a設置Kubernetes鏡像源
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配置鏡像加速器
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' {"registry-mirrors": ["https://1k8zbux8.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker安裝kubeadm,kubelet和kubectl
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0 systemctl enable kubelet #開機啟動部署Kubernetes Master
在Master節點執行.如果是阿里云服務器這里的apiserve需要修改成自己的master內網地址
kubeadm init \ --apiserver-advertise-address=172.28.117.97 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.18.0 \ --service-cidr=10.1.0.0/16 \ --pod-network-cidr=10.244.0.0/16出現如下信息表示成功
Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configYou should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:https://kubernetes.io/docs/concepts/cluster-administration/addons/Then you can join any number of worker nodes by running the following on each as root:kubeadm join 172.28.117.97:6443 --token u9e5os.l9tozto1jh4n8bn7 \--discovery-token-ca-cert-hash sha256:dc644816ced7b82013ac3a6b1d2ad7467b7d33b7e1693dd1d82c9f9126668392按照提示配置一下內容, 使用kubectl工具:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config加入Kubernetes Node
在Node節點執行
kubeadm join 172.28.117.97:6443 --token u9e5os.l9tozto1jh4n8bn7 \--discovery-token-ca-cert-hash sha256:dc644816ced7b82013ac3a6b1d2ad7467b7d33b7e1693dd1d82c9f9126668392默認token有效期為24小時,當過期之后,該token就不可用了。這時就需要重新創建token,操作如下:
kubeadm token create --print-join-command
部署CNI網絡插件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml查看
[root@master1 ~]# kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE coredns-7ff77c879f-m48fj 1/1 Running 0 2m46s coredns-7ff77c879f-rn6p8 1/1 Running 0 2m46s etcd-master1 1/1 Running 0 2m55s kube-apiserver-master1 1/1 Running 0 2m55s kube-controller-manager-master1 1/1 Running 0 2m55s kube-flannel-ds-58fb4 1/1 Running 0 83s kube-flannel-ds-782gl 1/1 Running 0 83s kube-flannel-ds-qwft4 1/1 Running 0 83s kube-proxy-455lf 1/1 Running 0 2m35s kube-proxy-dtbbc 1/1 Running 0 2m31s kube-proxy-kn7s8 1/1 Running 0 2m46s kube-scheduler-master1 1/1 Running 0 2m55s[root@master1 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master1 Ready master 5m5s v1.18.0 node1 Ready <none> 4m36s v1.18.0 node2 Ready <none> 4m32s v1.18.0測試Kubernetes集群
在Kubernetes集群中創建一個pod,驗證是否正常運行
訪問地址: http://NodePort:Port
http://120.25.169.231:32071/
http://120.24.221.223:32071/
http://120.25.205.141:32071/
資源類型
什么是資源?
k8s中的所有內容都被抽象為資源,資源實例化之后叫做對象.
k8s中存在哪些資源
名稱空間級別
工作負載型資源(workload):Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet,Job,CronJob
服務發現及負載均衡型資源(ServiceDiscovery LoadBalance): Service, Ingress …
配置與存儲型資源: Volume(存儲卷),CSI(容器存儲接口)
特殊類型的存儲卷: ConfigMap(當配置中心來使用的資源類型),Secret(保存敏感數據),DownwardAPI(把外部環境中的信息輸出給容器)
集群級別資源
Namespace,Node,Role,ClusterRole,RoleBinding,ClusterRoleBinding
元數據型資源
HPA,PodTemplate,LimitRange
資源清單
資源清單的含義
??在k8s中,一般使用yaml格式的文件來創建符合我們預期期望的pod,這樣yaml文件我們一般稱為資源清單.
必須存在的屬性
| version | String | 這里指的是K8s API的版本,目前基本上是v1,可以用kubectl api-versions 命令查詢 |
| kind | String | 這里指的是yaml文件定義的資源類型和角色,比如: Pod |
| metadata | Object | 元數據對象,固定值就寫metadata |
| metadata.name | String | 元數據對象的名字,這里由我們編寫,比如命名Pod的名字 |
| metadata.namespace | String | 元數據對象的命名空間,由我們自身定義 |
| spec | Object | 詳細定義對象,固定值就寫spec |
| spec.containers[] | list | 這里是spec對象的容器列表定義,是個列表 |
| spec.containers[].name | String | 這里定義容器的名字 |
| spec.containers[].image | String | 這里定義要用到的鏡像名稱 |
示例:pod.yaml
apiVersion: v1 kind: Pod metadata: name: myapp-podnamespace: defaultlabels: app: myappversion: v1spec:containers:- name: appimage: nginx- name: storeimage: mysql容器生命周期
InitC
Pod 能夠具有多個容器,應用運行在容器里面,但是他也有可能有一個或多個先于應用容器啟動的Init容器.
Init容器與普通的容器非常像,除了以下兩點:
??1. Init容器總是運行到成功完成為止.
??2. 每個Init容器都必須在下一個Init容器啟動之前完成.
如果Pod的init容器啟動失敗,Kubernetes會不斷的重啟該Pod,直到Init容器成功為止.然而,
如果Pod對應的restartPolicy為Never,它不會重新啟動.
Kubernetes Volume
默認情況下容器中的磁盤文件是非持久化的,對于運行在容器中的應用來說面臨兩個問題:
Kubernetes Volume具有明確的生命周期 - 與pod相同。因此,Volume的生命周期比Pod中運行的任何容器要持久,在容器重新啟動時能可以保留數據,當然,當Pod被刪除不存在時,Volume也將消失。注意,Kubernetes支持許多類型的Volume,Pod可以同時使用任意類型/數量的Volume。
要使用Volume,pod需要指定Volume的類型和內容(spec.volumes字段),和映射到容器的位置(spec.containers.volumeMounts字段)
Volume 類型
emptyDir
使用emptyDir,當Pod分配到Node上時,將會創建emptyDir,并且只要Node上的Pod一直運行,Volume就會一直存。當Pod(不管任何原因)從Node上被刪除時,emptyDir也同時會刪除,存儲的數據也將永久刪除。注:刪除容器不影響emptyDir。
示例
apiVersion: v1 kind: Pod metadata:name: test-pd spec:containers:- image: gcr.io/google_containers/test-webservername: test-containervolumeMounts:- mountPath: /cachename: cache-volumevolumes:- name: cache-volumeemptyDir: {}hostPath
hostPath允許掛載Node上的文件系統到Pod里面去。如果Pod需要使用Node上的文件,可以使用hostPath。
示例
apiVersion: v1 kind: Pod metadata:name: test-pd spec:containers:- image: gcr.io/google_containers/test-webservername: test-containervolumeMounts:- mountPath: /test-pdname: test-volumevolumes:- name: test-volumehostPath:# directory location on hostpath: /datagitRepo
gitRepo volume將git代碼下拉到指定的容器路徑中。
示例:
apiVersion: v1 kind: Pod metadata:name: server spec:containers:- image: nginxname: nginxvolumeMounts:- mountPath: /mypathname: git-volumevolumes:- name: git-volumegitRepo:repository: "git@somewhere:me/my-git-repository.git"revision: "22f1d8406d464b0c0874075539c1f2e96c253775"推薦閱讀:https://www.infoq.cn/article/KNMAVdo3jXs3qPKqTZBw
總結
以上是生活随笔為你收集整理的Kubernetes学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win10自带的邮件email上登录qq
- 下一篇: 系统可行性研究