kubernetes學習

kubernetes

kubernetes 知識點

1. 核心組件

  • etcd 保存整個集羣的狀態信息,感覺相當於k8s的數據庫
  • apiserver 提供對k8s資源操作的唯一入口,並提供認證授權,訪問控制,API註冊與發現等機制
  • controller manager 負責維護集羣的狀態,eg:故障檢測,自動擴展pod,滾動更新等
  • scheduler 負責對資源的調度,按着預定的調度策略將pod調度到相應的集羣上
  • kubelet 負責維護容器的生命週期,相當於在node上的agent,負責管理pods和它們上面的容器,images鏡像、volumes等
  • kube-proxy 負責爲service提供集羣內部的服務發現和負載均衡

2. kubernetes 常用命令

  • 查看集羣信息
kubectl cluster-info
  • 在集羣中運行一個應用程序
kubectl run nginx-test  --replicas=3 --labels='app=nginx' --image=nginx:latest --port=80  
#使用kubectl run命令啓動一個pod,自定義名稱爲nginx-test,啓動了3個pod副本,並給pod打上標籤app=nginx,這個pod拉取docker鏡像nginx:latest,開放端口80
  • 查看集羣中所有pod
kubectl get po
kubectl get pod
kubectl get pods
  • 根據標籤label查看集羣中pod
kubectl get pods -l app
kubectl get pods -l app=nginx
  • 查看標籤爲app=nginx的pod在集羣中具體分配在哪個節點和pod的ip
kubectl get pods -l app=nginx -o wide
  • 查看pod的詳細信息
kubectl describe pods <podname>
  • 查看集羣中的deployment(其他命令與pod類似)
kubectl get deploy
  • 查看集羣中的replica set(其他命令與pod類似)
kubectl get replicaset
kubectl get rs
  • 創建一個service,集羣中的資源通過service與外界交互
kubectl expose deploy nginx-test --port=8080 --target-port=80 --name=nginx-service
#k8s集羣通過deploy來管理,導出名爲nginx-test的deploy,爲其創建名爲nginx-service的服務開放給外界,使外界能通過nginx-service來和nginx-test交互,外部端口爲8080,內部端口爲80
  • 查看集羣中的服務(其他命令與pod類似)
kubectl get svc
  • 查看pod中容器的日誌
kubectl log <podname>    #查看指定pod內容器的日誌  
kubectl log -l app=nginx #查看標籤lable爲app=nginx下的pod的容器日誌
  • pod的副本的擴容和縮容
kubectl scale deploy nginx-test --replicas10
#通過kubectl scale將名爲nginx-test的deploy重新定義有10個副本pod
  • 查看pod副本擴容縮容的實時進度
kubectl rollout status deploy nginx-test
  • 刪除資源

pod和rs不能直接被刪除,其被deploy控制,即使刪除了某一pod,也會創建新的pod來對應配置pod副本數量,要想刪除pod,只能用刪除其deploy來刪除,或者變更pod副本配置縮容(如上)

kubectl delete deploy nginx-test  #刪除部署的deploy(刪除其對於的pod和rs)
kubectl delete svc nginx-service  #刪除創建的service

3. 應用創建部署yaml文件

tomsun28之後的k8s應用部署修改,都確定使用apply形式部署更新,使用git版本控制創建資源,好處多多

kubectl apply -f nginx.yaml    ##更新式創建資源,如果不存在此資源則創建,如存在改動則調整資源(推薦)
kubectl delete -f nginx.yaml   #資源(pod,deployment,service,replicaset...)刪除銷燬
  • kubernetes部署nginx集羣

nginx.yaml :

# ----------------------nginx--------------------- #

# ------nginx deployment------ #
kind: Deployment
apiVersion: apps/v1beta2
metadata:
 name: nginx-deployment
 labels: 
  app: nginx
spec:
 replicas: 3
 selector:
  matchLabels:
   app: nginx
 template:
  metadata:
   labels:
    app: nginx
  spec:
   containers:
   - name: nginx
     image: 192.167.2.144:5000/nginx:latest
     ports:
     - containerPort: 80

---

# -------nginx-service--------- #
apiVersion: v1
kind: Service
metadata:
 name: nginx-service
spec:
 type: NodePort
 ports:
 - port: 80
   targetPort: 80
   nodePort: 30001
 selector:
  app: nginx

kubectl apply -f nginx.yaml

記一下對kubernetes集羣的搭建部署

ubantu下用kubeadm搭建kubernetes集羣

官方安裝教程

  1. ubuntu + docker 環境 (目前是兩個服務器組建集羣server1+server2)
  2. 安裝kubelet kubeadm和kubectl
  • 安裝 apt-transport-https

# apt-get update && apt-get install -y apt-transport-https

  • 安裝gpg證書(阿里鏡像倉庫的k8s)

# curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -

  • 更新軟件源信息
 # cat << EOF >/etc/apt/sources.list.d/kubernetes.list  
   deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main  
   EOF 
  • 更新並安裝kubelet kubeadm kubectl

# apt-get update && apt-get install -y kubelet kubeadm kubectl
指定版本爲:
# apt-get update && apt-get install -y kubelet=1.11.1-00 kubeadm=1.11.1-00 kubectl=1.11.1-00

  • 關閉swap

sudo swapoff -a

  1. master server1上初始化部署kubernetes的master
  • 獲取初始化所需版本docker鏡像,k8s=v1.11.1在我的docker hub 's tomsun28可以拉取
# kubeadm config images list ##查詢當前kubeadm版本所需images
# kubeadm config images pull ##拉取這些images
k8s=v1.11.1所對應鏡像及版本:
k8s.gcr.io/coredns:1.1.3
k8s.gcr.io/etcd-amd64:3.2.18
k8s.gcr.io/kube-apiserver-amd64:v1.11.1
k8s.gcr.io/kube-controller-manager-amd64:v1.11.1
k8s.gcr.io/kube-proxy-amd64:v1.11.1
k8s.gcr.io/kube-scheduler-amd64:v1.11.1
k8s.gcr.io/pause:3.1
  • 初始化master

kubeadm init --kubernetes-version=v1.11.1 --apiserver-advertise-address=116.196.81.106 --pod-network-cidr=10.244.0.0/16

--apiserver-advertise-address=<ip>
指定apiserver的訪問ip,ip默認爲當前虛擬機的默認網卡ip.
當ip爲內網地址時,k8s集羣只能搭建在網段內部,如果有需求通過外網ip來操作apiserver,需要在啓動集羣時添加可信參數 --apiserver-cert-extra-sans=116.196.81.106 將外網的ip添加進去.  
當ip爲外網地址時,可以實現不同網段的虛擬機組成k8s集羣(目前我就是這個需要,一個京東雲一個阿里雲),暫時還沒測這種跨公網的集羣性能咋樣,畢竟考慮到網速帶寬等不如內網,但有一個優勢就是可以整合不同的資源,不被同一雲商所束縛,jd掛了ali還可以用.
  • 成功之後會有join集羣的腳步提示,記一下

kubeadm join 192.168.0.3:6443 --token q6gmgt.3dakenwttapw4n2o --discovery-token-ca-cert-hash sha256:dbf69119e962456c239c5f7821ee9a0db46fb643fc40da8776d4e032de072085

  • 根據output提示,to start using your cluster, you need to run(no root user )
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

或者(root user):
export KUBECONFIG=/etc/kubernetes/admin.conf

  1. 安裝 pod network 提供 pods 節點之前相互通信
  • 運行下面命令設置 /proc/sys/net/bridge/bridge-nf-call-iptables爲1
sysctl net.bridge.bridge-nf-call-iptables=1
  • 選擇 flannel 作爲 pod network
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/c5d10c8/Documentation/kube-flannel.yml
  • 要使 flannel 能正常使用,需要在master初始化時 kubeadm init 添加對應pod-network-cidr

kubeadm init --pod-network-cidr=10.244.0.0/16

  • 解除master不能調度運行其他pod的限制

kubectl taint nodes --all node-role.kubernetes.io/master-

  1. server2上部署kebernetes並作爲節點join to master
  • 在server2服務器上執行步驟2
  • 作爲node節點加入到master集羣中

kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>

  1. 在master上查看集羣node節點分佈

kubectl get nodes

  1. 對kubeadm所做的搭建進行undo revert

kubeadm reset

參考來自
kubernetes官方部署文檔




轉載請註明 from tomsun28

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章