kubernetes資源類別介紹


類別 名稱
資源對象 Pod、ReplicaSet、ReplicationController、Deployment、StatefulSet、DaemonSet、Job、CronJob、HorizontalPodAutoscaling
配置對象 Node、Namespace、Service、Secret、ConfigMap、Ingress、Label、ThirdPartyResource、 ServiceAccount
存儲對象 Volume、Persistent Volume
策略對象 SecurityContext、ResourceQuota、LimitRange

pod狀態介紹

1、pending(掛起)  例如沒有適合的節點運行pod

2、running (運行)

3、fAILED (失敗)

4、Succeeded(成功)

5、Unknown (例如kubelet掛了)

創建Pod經歷階段

 apiservice  -> etcd -> statefulset(調度) -> node節點

Pod生命周期的重要行為:

1、初始化容器

2、容器探測: 1、liveness  探測容器是否處於存活狀態  2、readiness 容器中的程序是否正常提供服務

 

 pod重啟策略

  restartPolicy 

1、Always 總是重啟 (默認策略)

2、OnFailure 狀態錯誤時重啟

3、Never  掛了不重啟

4、Default  

 

pod控制器:

  replicaset:代用戶創建指定的pod數,並確保pod一直處於用戶期望的狀態,如果少了就添加pod,多了就干掉多的pod,支持自動擴縮容。

 ###Deployment:控制replicaset進行控制pod,支持滾動更新及回滾等操作,管理無狀態應用最后的工具。

DaenmonSet:用於確保集群的每個節點只運行一個特定的pod(新增節點會自動添加該pod),通常用來實現系統及的托管任務。

Job:按照用戶指定的pod數量啟動pod,當pod任務完成后pod掛了不會重啟(任務未完成會重啟),只是完成一次性任務的服務。

Cronjob:在job基礎上周期性完成任務。(只能管控無狀態群體)

StatefuiSet:管理有狀態應用,每個應用單獨管理、擁有獨有標識、獨有數據記憶,一旦節點故障,添加的新節點會重新初始化操作。例如redis cluster 節點(少用)

Operator:

 

Ingress Controller:獨立運行一個或一組pod資源 ,通常就是一個應用程序,該程序擁有7層代理能力。可選擇 Haproxy、nginx、envoy、traefik(適合微服務)

Ingress資源:可以直接通過編輯注入到ingress Controller中並保存及重載配置文件。

 

Helm:k8s官方提供 類似yum

 

 Services:

kube-proxy 始終監視着api-service中有關services的變動信息。一旦有service的資源的變動或創建,kube-proxy都會將當前節點的規則轉換會service能訪問的規則。(一般為iptables或ipvs規則)

service三種模型(代理模式) 4層代理;

1.userspace  1.1之前   內核空間->用戶空間(kube-proxy)->內核空間(service ip)分發(效率低)

2.iptables  (1.10之前)

3.ipvs  (1.11開始使用)

 

 #service類型(核心資源之一)

ExtrnalName:集群外部引入到集群內部

ClusterIP(默認):集群ip地址(集群內部可達集群外部不可訪問)

NodePort:用於集群的  client -> NodeIP -> ClusterPoet -> PodIP:containerPort

LoadBalancer:負載均衡方式

 

##特殊服務(無頭服務)

既service集群無clusterIP,將ClusterIP設置為None。將service名稱直接解析到pod的ip。

 

 

資源記錄:

SVN_NAME.NS_NAME.DOMAIN.LTD.

svc.cluster.local.

資源記錄:
SVC_NAME.NS_NAME.DOMAIN.LTD.

svc.cluster.local.

redis.default.svc.cluster.local.

 

對象URL格式:
/apis/[GROUP]/[VERSION]/namespace/[NAMESPACE_NAME]/[KIND]/[OBJECT_ID]

 

 

 

 

 
 #獲取資源配置清單信息
#1.獲取api-version資源信息
kubectl  api-versions


#獲取yaml文件編寫需要的內容
kubectl  explain  [資源名字]

#查看創建pod需要的信息

kubectl explain pods

#查看pod中spec需要的信息

kubectl explain pods.spec

 


 

 

kubernetes 中yaml文件數據定義介紹

apiVersion: api版本
kind: 資源類型
metadata: #元數據
name: 名字
namespace:所在命名空間
labels: 標簽信息(可以多個)
##標簽是key:value格式的key,value最長只能使用63個字符
# key只能是以數字、之母、_、-、點(.)這五類的組合,
#value可以為空,但只能以數字及字母開頭或結尾
app: 標簽內容
annotations: #注釋(不具備什么功能 就是注釋 )
zhushi: ”lalalalalalalal saddas”
spec:期望狀態
containers:容器信息(可以多個名稱雲鏡像)
- name: 自定義name名稱
image:鏡像名
- name:
image:
nodeSelector:#節點選擇器(如給指定運行在disk為ssd的node上)
disk: ssd
imagePullPolicy:#是否使用本地或遠端的下載鏡像
#1、Always
#2、Never
#3、IfNotPresent
livenessProbe:#存活性探針

    #1、exec #命令

    #2、httpGet #http請求 指定ip:port

    #3、tcpSocket  #

    readinessProbe:#就緒狀態探針

     #1、exec #命令

    #2、httpGet #http請求 指定ip:port

    #3、tcpSocket  #

 

   



例如:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  namespace: default
  labels: 
    app: my-pod
     
spec:
  containers:
  - name: my-pod
    image: nginx
  - name: mybusybox
    image: busybox
    command:
    - "/bin/sh"
    - "-c"
    - "echo `date` >>/tmp/aa.txt "
例子

 

1、  replicaset創建例子

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: myreplicaset
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      test_node: k8s-node1
  template:
    metadata:
      name: my-replicaset-pod
      labels:
        test_node: k8s-node1
    spec:
      containers:
      - name: my-rep
        image: nginx
        ports:
        - name: http
          containerPort: 80

replicaset擴容或收縮方法

1、edit在線編輯

[root@k8s-m ~]# kubectl  edit rs  myreplicaset

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
  creationTimestamp: 2018-09-02T12:12:07Z
  generation: 1
  name: myreplicaset
  namespace: default
  resourceVersion: "63280"
  selfLink: /apis/extensions/v1beta1/namespaces/default/replicasets/myreplicaset
  uid: 6958fc28-aea9-11e8-96d6-000c2924d722
spec:
  replicas: 2 ##數量修改
  selector:
    matchLabels:
      test_node: k8s-node1

selector:
matchLabels:
test_node: k8s-node1
template:
metadata:
creationTimestamp: null
labels:
test_node: k8s-node1
name: my-replicaset-pod
spec:
containers:
- image: nginx ##修改鏡像可完成在線升級鏡像 (不過需要干掉之前的pod讓他重新創建)
imagePullPolicy: Always
name: my-rep
ports:
- containerPort: 80


。。。。省略

 2、Deployment的yaml文件例子

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mydeploy
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      test_node: k8s-node1
  template:
    metadata:
      labels:
        test_node: k8s-node1
    spec:
      containers:
      - name: mydeploy-pod
        image: nginx
        ports:
        - name: http
          containerPort: 80

Deployment創建

kubectl apply -f mydeploy.yaml (可以使用apply、apply既可以創建也可以更新 )

Deployment更愛rs的pod數量或更新,之家修改Deployment的yaml文件即可,將rs的數量改變或鏡像改變即可。

然后執行  kubectl   apply  -f  mydeploy.yaml (deploy的yaml文件可以執行多次)

deploy每次改變它都會同步到etcd中,然后apiserver發現他與etcd中的狀態不同,然后修改到它的到期望的狀態。實現現有狀態到期望狀態的改變。

##查看deploy更新歷史信息 kubectl rollout history deployment [depoly名]

kubectl rollout history deployment mydeploy

###回滾

kubectl rollout undo deployment [deploy名]  (默認上一個版本)

##指定版本

kubectl rollout undo deployment [deploy名]   --to-revision=[版本]

 

3、DaenmonSet

 DaenmonSet例子

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: myds
  namespace: default
spec:
  selector:
    matchLabels:
      test_node: k8s-node1
  template:
    metadata:
      labels:
        test_node: k8s-node1
    spec:
      containers:
      - name: filebeat
        image: filebeat
        env:  ##傳遞環境變量
          - name: REDIS_HOST
            value: redis.default.svc.cluster.local
          - name: REDIS_LOG_LEVEN
            value: info

啟動 

kubectl apply -f mydaemonset.yaml

 

 

4、service創建

 

apiVersion: v1
kind: Service
metadata: 
  name: svc-redis
  namespace: default
spec:

# selector:

   #   disk: ssd

 clusterIP: 10.96.96.96 type: ClusterIP ports: - port: 6379 #service端口 targetPort: 6379 #pod端口

創建

kubectl  apply -f service-redis.yaml

4.1 NodePort類型service創建

apiVersion: v1
kind: Service
metadata: 
  name: svc-redis
  namespace: default
spec:
  clusterIP: 10.96.96.96
  type: NodePort
  ports:
  - port:  80 #serivce端口
    targetPort: 80 #pod端口
    nodePort:  30000  #節點端口(動態分配,可以不定義)

 

5、Ingress Controller安裝

 

#創建命名空間

kubectl  create  namespace nginx-ingress

##安裝

git clone https://github.com/kubernetes/ingress-nginx.git

cd ingress-nginx/deploy

kubectl apply -f ./

##cat deploy-demo.yaml 
apiVersion: v1 kind: Service metadata: name: nyapp namespace: default spec: selector: app: myapp ports: - name: http targetPort: 80 port: 80 --- apiVersion: apps/v1 kind: Deployment metadata: name: myapp-deploy namespace: default spec: replicas: 3 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp image: ikubernetes/myapp:v2 ports: - name: http containerPort: 80

 

 kubectl  apply -f deploy-demo.yaml

 

apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
spec:
  type: NodePort
  ports:
  - name: http 
    port: 80 #service
    targetPort: 80 #容器
    protocol: TCP

      nodePort: 30080


  - name: https
    port: 443 #service
    targetPort: 443 #容器
    protocol: TCP

      nodePort: 30443


  selector:
    app: ingress-nginx

kubectl  get svc -n ingress-nginx   #(上面的文件)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM