k8s 学习笔记
DaemonSet:每个运算节点上部署一份
Deployment 管 ReplicaSet,ReplicaSet 管 Pod
StatefulSet 管有状态应用的控制器
===
资源字段:api版本(apiVersion),kind,metadata,清单(spec)、状态(status)
name通常定义在metadata下面
====
Namespace将K8S分组了,k8s中默认的名称空间有:default 、kube-system、kube-public
查询特定资源需要带上相应的名称空间
===
标签和资源是多对多的关系,一个资源可以有多个标签,一个标签可以对应多个资源
===
matchLabels ( = )
matchExpressions (in, not in,exists
======
http、https类型的资源推荐用Ingress来暴露接口
=======
kube-proxy :建立pod网络和集群网络的关系
三种常用流量调度模式:
userspace,iptables,ipvs(推荐)
======
nslookup用于查询DNS的记录,查询域名解析是否正常,如:nslookup domain [dns-server]
用bind9做DNS服务
======= dig使用说明:https://www.cnblogs.com/sparkdev/p/7777871.html
dig 命令主要用来从 DNS 域名服务器查询主机地址信息。所以可以用来测试DNS服务是否正常
例如解析harbor.od.comz,要获得精简的结果可以使用 +short 选项: dig -t A harbor.od.com +short
指定 DNS 服务器的方式为使用 @ 符号:dig -t A www.baidu.com @192.168.0.2 +short
可以使用 dig 的 -x 选项来反向解析 IP 地址对应的域名:dig -x 8.8.8.8 +short
dig -t A nginx-dp.kube-public.svc.cluster.local. @192.168.0.2 +short
====
把正式还原成json格式,可以看到证书的签发时间:cfssl-certinfo -cert apiserver.pem
查看域证书:cfssl-certinfo -domain www.baidu.com
可以通过kubelet.kubeconfig中拿到证书相关信息,通过base64 -d 反解,然后写入文件,
然后将证书还原成json,从而了解证书的信息
=====
可以利用md5sum计算文件的md5,从而看两个文件是否一样
========
查看名称空间:kubectl get namespace 或 kubectl get ns (namespace简称ns)
查看空间中的资源:kubectl get all -n default
创建空间:kubectl create namespace app
删除空间:kubectl delete namespace app
创建deployment(简写deploy):kubectl create deployment nginx-dp --image=nginx:1.7.9 -n kube-public
查看deployment : kubectl get deployment -n kube-public
展示扩展信息(-o wide):kubectl get pods -n kube-public -o wide
看详细信息:kubectl describe deployment nginx-dp -n kube-public
进入pod:kubectl -exec -it pod-id /bin/bash -n kube-public
删除pod(删除是重启的方法之一):kubectl delete pod pod-id -n kube-public [--force --grace-period=0 ]
删除deployment:kubectl delete deploy nginx-dp -n kube-public
创建服务:kubectl expose deployment nginx-dp --port=80 -n kube-public
查看服务:kubectl get svc -n kube-public
扩容:kubectl scale deployment nginx-dp --replication=2 -n kube-public
命令大全:kubectl --help
查看yaml:kubectl get pods pod-id -o yaml -n kube-public
查看yaml中字段含义:kubectl explain service.metadata
语法格式:kubectl create/apply/delete -f /path/yaml
应用yaml:kubectl apply -f nginx-svc.yaml
利用yaml删除:kubectl delete -f nginx-svc.yaml
在线修改yaml:kubectl edit svc nginx-dp
daemonset缩写ds
=============
k8s中文社区:http://docs.kubernetes.org.cn/
加静态路由:route add -net 172.7.21.0/24 gw 10.4.7.21 dev eth0
=========
K8S的DNS实现服务在集群内被自动发现
服务被集群外访问:
1)使用NodePort型service
注意:无法使用kube-proxy的ipvs模型,只能使用iptables模型
2)使用Ingress资源:
注意:Ingress只能调度并暴露7层应用,特指http和https协议
=========
Kubernetes Scheduler, 它的作用是将待调度的Pod通过一些复杂的调度流
程计算出最佳目标节点, 然后绑定到该节点上
Controller的作用:当发生各种故障导致某资源对象的状态
发生变化时, Controller会尝试将其状态调整为期望的状态
kubelet通过cAdvisor监控容器和节点资源
每创建一个新的Pod, kubelet都会先创建一个Pause容器
Service的Cluster IP与NodePort等概念是kube-proxy服务通过iptables
的NAT转换实现的, kube-proxy在运行过程中动态创建与Service相关的
iptables规则, 这些规则实现了将访问服务(Cluster IP或NodePort) 的请
求负载分发到后端Pod的功能
kubectl describe pod pod_id 返回的内容有 EVENT 相关的信息
查看容器日志:kubectl logs pod_id
kubectl logs pod-id -c container_id
通过systemctl查看kubernetes服务的日志,如:systemctl status kube-controller-manager -l
可以先确定Pod在哪个节点
上, 然后登录这个节点, 从kubelet的日志中查询该Pod的完整日志, 然
后进行问题排查。 对于与Pod扩容相关或者与RC相关的问题, 则很可能
在kube-controller-manager及kube-scheduler的日志中找出问题的关键点
kube-proxy经常被我们忽视, 因为即使它意外停止, Pod的状
态也是正常的, 但会导致某些服务访问异常
查看某个服务的endpoint列表:kubectl get endpoints <service_name>
查看service的名称能否被解析:ping <service_name>.<namespace>.svc
========
ipvsadm -Ln
https://blog.stanley.wang/
docker ce
-------------尚硅谷
创建一个service: kubectl expose deployment nginx-deployment --port=3000 --target-port=80
(映射出来的端口是3000,pod内部是80)
创建一个deployment时,会自动创建rs
kubectl log myapp-pod -c test
查看集群内部dns pod: kubectl get pod -n kube-system
pod重启,会导致init容器重新执行
只能修改init容器spec下面的image字段,修改其他字段无效。
对init容器image的修改等价与重启pod
探针是kubelet对容器执行的定期诊断
HTTPGetAction若响应的状态码大于等于200且小于400,则认为诊断成功
RS比RC多了集合式的selector
deployment是声明式;RS是命令式
创建deployment时,deployment会创建一个RS,deployment是通过RS来控制pod的
Daemonset确保在全部或一些NODE上运行一个pod
可以通过spec.revisionHistoryLimit来指定deployment最多保留多少revision,默认保留所有revision;若将该项的值设为0,则Deployment就不允许回退了
加载镜像:docker load -i perl.tar
//////////// IPVSi
ipvsadm -Ln
kubectl get svc
保存镜像;docker save -o ***.tar 镜像名
加载;docker load -i ***.tar
使用目录创建configmap:
kubectl create configmap game-config --from-file=docs/user-gaide/
使用文件创建configmap:
kubectl create configmap game-config --from-file=docs/user-gaide/game.properties
查看configmap: kubectl get cm
使用字面值创建:
kubectl create configmap game-config --from-literal=special.how=very --from-literal=special.type=charm
修改configmap:kubectl edit configmap log-config
更新configmap后:使用cm挂载的环境变量不会更新;使用cm挂载的volume需要一段时间才会更新(大概10s)
卷的生命比pod中的容器长,当容器重启时,卷仍然存在;当pod不存在时,卷也将不存在
PV独立于pod的生命周期之外
Pod消耗节点资源,PVC消耗PV资源;PV和pvc是一对一的映射
要创建StatefulSet,则需要先创建一个无头service(clusterIP:None)
Namespace 对象仅用于资源对象名称的隔离,它自身并不能隔绝跨名称空间的 Pod 间通信,那是网络策略( network policy )资源的功能
无论是否为容器指定了要暴露的端口,都不会影响集群 中其他节点之上的 Pod 客户端对其进行访问
由 Docker 镜像启动容器时运行的应用程序在相应的 Dockerfile 中由 ENTRYPOINT 指令进行定义,传递给程序的参数则通过 CMD 指令指定,
ENTRYPOINT 指令不存在时, CMD 可用于同时指定程序及其参数
使用 printenv一类的命令都能在容器中获取到所有环境变量的列表 。
仅需要设置 spec.hostNetwork 的属性为 true 即可创建共享节点 网络名称空 间 的 Pod 对象