在Kubernetes中,所有對象都會被指定一個唯一的Name和UID。
用戶還可以指定一些不要求唯一性的數據附加到對象上,例如Label和Annotation。
1. Name
Name是創建一個Kubernetes對象時必須指定的,無論是Pod,ReplicaSet或者Deployment等等。如果通過REST API訪問的話,形式就如/api/v1/pods/some-name
。
一個Name只能由小寫字母,-
和.
組成,並且長度不能超過253個字符。
在同一個命名空間下,同種類型的對象,其Name必須唯一。
2. UID
Kubernetes在創建一個對象時,除了擁有Name以外,還會為其分配一個全局唯一的UID。
參考文章
https://kubernetes.io/docs/concepts/overview/working-with-objects/names/
Kubernetes基本概念之Namespace
Namespace類似於Linux系統中用戶的概念,通過將系統內部的對象分配到不同的Namespace中,形成邏輯上的分,便於不同的分組在共享集群資源的同時還能被分別管理。同一Namespace下的Kubenetes對象的Name必須唯一。
常見的 pod, service, replication controller 和 deployment 等都是屬於某一個 namespace 的(默認是 default),而 node, persistent volume,namespace 等資源則不屬於任何 namespace。
1. Namespace操作
1.1 查看
$ kubectl get namespaces
NAME STATUS AGE
default Active 1d kube-system Active 1d kube-public Active 1d
通過上述命令,可以查看到Kubernetes為我們初始化的三個Namespace:
- default:所有未指定Namespace的對象都會被分配在default命名空間。
- kube-system:所有由Kubernetes系統創建的資源都處於這個命名空間。
- kube-public:此命名空間下的資源可以被所有人訪問(包括未認證用戶)。
1.2 設置Namespace
通過--namespace
參數可以在一條命令中指定Namespace,只對單條命令有效。
$ kubectl --namespace=<insert-namespace-name-here> run nginx --image=nginx $ kubectl --namespace=<insert-namespace-name-here> get pods
還可以綁定一個Namespace到特定的上下文,這樣在此上下文中執行的kubectl命令都處於綁定的Namespace下。
$ kubectl config set-context $(kubectl config current-context) --namespace=<insert-namespace-name-here> # Validate it $ kubectl config view | grep namespace:
1.3 Namespace和DNS
當你創建一個Service時,Kubernetes會自動創建一個形如<service-name>.<namespace-name>.svc.cluster.local
的DNS項。如果集群中另一個服務調用這個服務時,僅僅指定了<service-name>
,那么Kubernetes會使用調用方所在的Namespace將<service-name>
補全。因此如果調用方和被調用方不處於同一個Namespace,你必須使用包含Namespace的service name(fully qualified domain name (FQDN))。
參考文章
https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/
https://blog.csdn.net/qq_34701586/article/details/78732470
初入門小實例
部署nginx服務
$ kubectl run my-nginx --image=nginx --port=80
$ kubectl get pod # 查看pod
發現pod狀態無論多久都是處於pending。READY字段一直是0/1,服務部署失敗的原因是”中國牆“的問題導致無法下載pod啟動時需要的谷歌鏡像,所以我們得間接的創建所需的鏡像。
補充: Pending狀態表示API Server已經創建Pod,但Pod內還有一個或者多個容器沒有創建,或者正在下載鏡像的過程。詳細的參考Pod聲明周期和重啟策略
創建gcr.io/google_containers/pause-amd64:3.0鏡像
$ docker pull googlecontainer/pause-amd64:3.0
$ docker tag googlecontainer/pause-amd64:3.0 gcr.io/google_containers/pause-amd64:3.0
kubernets指令
實例流程
$ kubectl version # 查看版本 Client Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.2", GitCommit:"269f928217957e7126dc87e6adfa82242bfe5b1e",
GitTreeState:"clean", BuildDate:"2017-07-03T15:31:10Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.2", GitCommit:"269f928217957e7126dc87e6adfa82242bfe5b1e",
GitTreeState:"clean", BuildDate:"2017-07-03T15:31:10Z", GoVersion:"go1.7.4", Compiler:"gc", Platform:"linux/amd64"} $ kubectl cluster-info # 顯示集群信息 Kubernetes master is running at http://localhost:8080 To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'. $ kubectl get nodes # 查看集群中有幾個Node NAME STATUS AGE 127.0.0.1 Ready 18h $ kubectl run my-nginx --image=nginx --replicas=2 --port=80 # 運行一個鏡像 deployment "my-nginx" created $ kubectl get pods # 查看pod NAME READY STATUS RESTARTS AGE my-nginx-379829228-cwlbb 0/1 ContainerCreating 0 20s my-nginx-379829228-czk6w 1/1 Running 0 20s $ kubectl describe pod my-nginx-379829228-cwlbb # 查看服務詳情信息 $ kubectl get deployments # 查看已部署 NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE my-nginx 2 2 2 2 3m $ kubectl delete pod my-nginx-379829228-cwlbb # 刪除pod pod "my-nginx-379829228-cwlbb" deleted $ kubectl get pods # 再次查看pod,發現由於replicas機制,pod又生成一個新的 NAME READY STATUS RESTARTS AGE my-nginx-379829228-czk6w 1/1 Running 0 11m my-nginx-379829228-gjd7d 0/1 ContainerCreating 0 5s $ kubectl delete deployment my-nginx # 刪除部署的my-nginx服務。徹底刪除pod deployment "my-nginx" deleted
對比docker命令
k8s的學習路線基本都是從docker[容器]到k8s的,因此兩個對比理解有助於記憶
$ docker run -d -e DOMAIN=cluster --name my-nginx -p 80:80 nginx $ kubectl run my-nginx --image=nginx --port=80 --env="DOMAIN=cluster" $ docker ps $ kubectl get pods $ docker exec [容器id] ls $ kubectl exec [pod_id] ls $ docker exec -it [容器id] /bin/sh # docker exec 交互式 $ kubectl exec -it [pod_id] -- /bin/sh $ docker info $ kubectl cluster-info
重要名詞
名詞 翻譯
Namespace #命名空間 Endpoint #服務端點 Controller Manager #管理控制中心 Replication #副本控制器 yaml #文件管理服務
# vi nginx.yaml
piVersion: extensions/v1beta1
kind: Deployment
metadata:
name: my-nginx
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
啟動管理服務
$ kubectl create -f nginx.yaml # 根據yaml文件創建服務 deployment "my-nginx" created $ kubectl get deployments # 查看deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE my-nginx 3 3 3 3 6s $ kubectl get pod # 查看Pod NAME READY STATUS RESTARTS AGE my-nginx-4087004473-dtrjp 1/1 Running 0 7s my-nginx-4087004473-jz80p 1/1 Running 0 7s my-nginx-4087004473-wh576 1/1 Running 0 7s $ kubectl delete -f nginx.yaml # 根據yaml文件刪除服務 deployment "my-nginx" deleted $ kubectl get pod No resources found. $ kubectl get deployment No resources found.
Service
$ kubectl run my-nginx --image=nginx --port=80 #部署一個nginx服務 $ kubectl expose deployment/my-nginx --type="NodePort" --port 80 # 創建一個service 且將其暴露到集群外可供訪問 service "my-nginx" exposed $ kubectl get services # 此時service列表多個my-nginx服務 NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.254.0.1 <none> 443/TCP 7d my-nginx 10.254.255.103 <nodes> 80:32589/TCP 7s
宿主主機內訪問該服務
同網段的機器訪問該服務
deployments
$ kubectl run my-nginx --image=nginx --port=80 # 運行nginx鏡像 $ kubectl run -i --tty my-nginx --image=nginx --port=80 -- sh # 交互式 shell 的方式運行 pod $ kubectl attach my-nginx-532658988-10kxd -i # 鏈接到運行中的容器 $ kubectl get deployments # 查看deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE my-nginx 1 1 1 1 25m $ kubectl scale deployment my-nginx --replicas=10 # 擴展10個副本 deployment "my-nginx" scaled $ kubectl scale deployment/my-nginx --replicas=10 # 作用效果等同上一條命令 deployment "my-nginx" scaled $ kubectl get deployments # 再次顯示deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE my-nginx 10 10 10 1 26m $ kubectl get pods NAME READY STATUS RESTARTS AGE my-nginx-379829228-38hkg 1/1 Running 0 5m my-nginx-379829228-7j15l 1/1 Running 0 31m my-nginx-379829228-c8mt3 1/1 Running 0 5m my-nginx-379829228-f6mm8 1/1 Running 0 5m my-nginx-379829228-q1rj0 1/1 Running 0 5m my-nginx-379829228-qg7lf 1/1 Running 0 5m my-nginx-379829228-rjfbq 1/1 Running 0 5m my-nginx-379829228-v581r 1/1 Running 0 5m my-nginx-379829228-wh49w 1/1 Running 0 5m my-nginx-379829228-wpn98 1/1 Running 0 5m $ kubectl scale deployment/my-nginx --replicas=1 # 縮擴到1個副本 deployment "my-nginx" scaled $ kubectl scale deployment my-nginx --replicas=1 # 作用效果等同上一條命令
deployment的更新回滾
$ kubectl create -f nginx.yaml $ kubectl get pod NAME READY STATUS RESTARTS AGE my-nginx-4087004473-4xj74 1/1 Running 0 3m my-nginx-4087004473-jkptq 1/1 Running 0 3m my-nginx-4087004473-m55s1 1/1 Running 0 3m $ kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE my-nginx 3 3 3 3 4m $ kubectl set image deployment/my-nginx nginx=nginx:1.9.1 # 更新應用的鏡像從1.7.9版本——>1.9.1 deployment "my-nginx" image updated $ kubectl rollout status deployment/my-nginx # 確認是否更新成功 deployment "my-nginx" successfully rolled out $ kubectl rollout undo deployment/my-nginx # 回滾到上一代版本 deployment "my-nginx" rolled back
ConfigMap-容器應用的配置管理
應用部署的一個最佳實踐是將應用所需配置信息和程序進行分離,一則程序可以更好的復用,二則能靈活的更改配置從而實現其他功能。
使用configMap替代環境變量
以yaml文件方式創建ConfigMap
# vi special-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: special-config
namespace: default
data:
special.how: very
special.type: charm
# vi env-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: env-config
namespace: default
data:
log_level: INFO
可以在Pod中這樣使用ConfigMap
# vi configMap.yaml
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
spec:
containers:
- name: test-container
image: nginx
command: [ "/bin/sh", "-c", "env" ]
env:
- name: SPECIAL_LEVEL_KEY #定義環境變量名稱
valueFrom: #key"special.how"對應的值
configMapKeyRef:
name: special-config #環境變量的值
key: special.how
- name: SPECIAL_TYPE_KEY
valueFrom:
configMapKeyRef:
name: special-config
key: special.type
restartPolicy: Never
啟動等一系列操作
$ kubectl create -f special-config.yaml configmap "special-config" created $ kubectl create -f env-config.yaml configmap "env-config" created $ kubectl get configmaps # 查看ConfigMap NAME DATA AGE env-config 1 38m special-config 2 39m $ kubectl describe configmap env-config # 讓我們看一下創建的ConfigMap Name: env-config Namespace: default Labels: <none> Annotations: <none> Data ==== log_level: 4 bytes $ kubectl get configmaps env-config -o yaml # 查看ConfigMap鍵的值 apiVersion: v1 data: log_level: INFO kind: ConfigMap metadata: creationTimestamp: 2017-11-30T07:29:49Z name: env-config namespace: default resourceVersion: "285268" selfLink: /api/v1/namespaces/default/configmaps/env-config uid: 3f473adf-d5a0-11e7-9830-0800275ae9e7 $ kubectl create -f configMap.yaml pod "dapi-test-pod" created $ kubectl get pod # 查看pod,狀態ContainerCreating NAME READY STATUS RESTARTS AGE dapi-test-pod 0/1 ContainerCreating 0 3s $ kubectl get pod # 隔一段時間再查看pod,發現並沒有返回什么 $ kubectl get pod --show-all # 顯示所有的權限查看pod NAME READY STATUS RESTARTS AGE dapi-test-pod 0/1 Completed 0 1m $ kubectl describe pod dapi-test-pod # 查看詳情 Name: dapi-test-pod Namespace: default Node: 127.0.0.1/127.0.0.1 Start Time: Thu, 30 Nov 2017 15:32:00 +0800 Labels: <none> Status: Succeeded IP: Controllers: <none> Containers: test-container: Container ID: docker://1ba533f43ee60c02e03dafb7bcb8495fc12264aaab229872df0b289a3c1b9976 Image: nginx Image ID: docker-pullable://docker.io/nginx@sha256:b81f317384d7388708a498555c28a7cce778a8f291d90021208b3eba3fe74887 Port: Command: /bin/sh -c env State: Terminated Reason: Completed Exit Code: 0 Started: Thu, 30 Nov 2017 15:32:25 +0800 Finished: Thu, 30 Nov 2017 15:32:25 +0800 Ready: False Restart Count: 0 Volume Mounts: <none> Environment Variables: SPECIAL_LEVEL_KEY: <set to the key 'special.how' of config map 'special-config'> SPECIAL_TYPE_KEY: <set to the key 'special.type' of config map 'special-config'> Conditions: Type Status Initialized True Ready False PodScheduled True No volumes. QoS Class: BestEffort Tolerations: <none> Events: FirstSeen LastSeen Count From SubObjectPath Type Reason Message --------- -------- ----- ---- ------------- -------- ------ ------- 3m 3m 1 {default-scheduler } Normal Scheduled Successfully assigned dapi-test-pod to 127.0.0.1 3m 3m 1 {kubelet 127.0.0.1} spec.containers{test-container} Normal Pulling pulling image "nginx" 3m 2m 2 {kubelet 127.0.0.1} Warning MissingClusterDNS kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to DNSDefault policy. 2m 2m 1 {kubelet 127.0.0.1} spec.containers{test-container} Normal Pulled Successfully pulled image "nginx" 2m 2m 1 {kubelet 127.0.0.1} spec.containers{test-container} Normal Created Created container with docker id 1ba533f43ee6; Security:[seccomp=unconfined] 2m 2m 1 {kubelet 127.0.0.1} spec.containers{test-container} Normal Started Started container with docker id 1ba533f43ee6 # 可知container started 成功,進一步查看日志 $ docker logs 1ba KUBERNETES_SERVICE_PORT=443 KUBERNETES_PORT=tcp://10.254.0.1:443 MY_SERVICE_PORT_80_TCP=tcp://10.254.110.249:80 MY_SERVICE_PORT_443_TCP_ADDR=10.254.110.249 HOSTNAME=dapi-test-pod MY_SERVICE_PORT_443_TCP_PORT=443 HOME=/root MY_SERVICE_PORT_443_TCP_PROTO=tcp MY_SERVICE_SERVICE_PORT_HTTP=80 SPECIAL_TYPE_KEY=charm MY_SERVICE_SERVICE_PORT_HTTPS=443 MY_SERVICE_PORT_443_TCP=tcp://10.254.110.249:443 MY_SERVICE_SERVICE_HOST=10.254.110.249 KUBERNETES_PORT_443_TCP_ADDR=10.254.0.1 NGINX_VERSION=1.13.7-1~stretch PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin KUBERNETES_PORT_443_TCP_PORT=443 NJS_VERSION=1.13.7.0.1.15-1~stretch KUBERNETES_PORT_443_TCP_PROTO=tcp MY_SERVICE_SERVICE_PORT=80 MY_SERVICE_PORT=tcp://10.254.110.249:80 SPECIAL_LEVEL_KEY=very MY_SERVICE_PORT_80_TCP_ADDR=10.254.110.249 KUBERNETES_PORT_443_TCP=tcp://10.254.0.1:443 KUBERNETES_SERVICE_PORT_HTTPS=443 KUBERNETES_SERVICE_HOST=10.254.0.1 MY_SERVICE_PORT_80_TCP_PORT=80 PWD=/ MY_SERVICE_PORT_80_TCP_PROTO=tcp
ConfigMap的限制條件
ConfigMap必須在Pod之前創建才能被使用。
ConfigMap可以定義其屬於哪個Namspece,只有在同一個Namespace中的pod才能引用。
刪除Pod
有時候deployment、rs、rc、services都為0,但是Pod確存在着。則重啟kubelet服務即可。
$ systemctl restart kubelet
1
補充
kubectl get node # 列出當前節點名
NAME STATUS AGE
127.0.0.1 Ready 6d
$ curl localhost:8080/api/v1/proxy/nodes/127.0.0.1/pods ## 已知當前節點名為127.0.0.1,用如下命令即可獲得該節點上所有運行節點
{"kind":"PodList","apiVersion":"v1","metadata":{},"items":null}
我們最好不要越過RC而直接創建Pod,因為Replication Controller會通過RC管理Pod副本。實現自動創建、補足、替換、刪除Pod副本,大大提高系統的容災能力
重新調度(Rescheduling)
彈性伸縮(Scaling)
滾動更新(Rolling Updates)
報錯
$ sudo kubectl create -f file.yaml
YAML error: found character that cannot start any token
# or
error:yaml: line 15: found a tab character that violate indentation
#file.yaml不可用tab鍵來空格
##############
#
kubernetes一步一步搭建(一)安裝與http訪問
helloworld_scut: my-nginx.yaml格式是錯的。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-demo
spec:
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80