• K8S基础笔记


     1、namespace

    • 名称空间
    • 用来对集群资源进行隔离划分,默认只隔离资源,不隔离网络
    • k8s默认的名称空间为default

    查看k8s的所有命名空间

    kubectl get namespace

    或者

    kubectl get ns

    创建名称空间

    kubectl create ns 名称

    或使用yaml方式

    1.  编写yaml
    2. kubectl apply -f yaml文件
    1. appVersion: v1
    2. kind: Namespace
    3. metedata:
    4. name: hello

    appVersion表示版本号,kind表示种类(说明是名称空间,若是pod就是pod类型),metedata.name表示名称为hello的名称空间

    删除yaml方式创建的名称空间,需要这样删除:

    1. #可以yaml文件和yaml文件执行的结果(这里是删除名称空间)
    2. kubectl delete -f yaml文件

    删除名称空间

    kubectl delete ns 名称

    注意以下命令

    kubectl get pods -A

    • -A:All表示所有的名称空间
    • 这条命令表示获取所有名称空间下的所有pod

    kubectl get pods

    • 没有指定名称空间,那么默认为default空间

    kubectl get pods -n kubernetes-dashboard

    • -n:-namespace:用于指定名称空间
    • 这条命令表示获取kubernetes-dashboard空间下的所有pod

    2、Pod

    • 运行中的一组容器,Pod是kubernetes中应用的最小单位
    • 一个Pod可以有一个或多个容器
    2.1、命令行创建Pod
    kubectl run mynginx --image=nginx
    • 没有指定namespace,默认在default下创建的Pod
    • mynginx:Pod的名称
    • --image=nginx:使用nginx镜像去构建该Pod,nginx由于没有指定镜像版本,默认使用最新的

    删除Pod

    kubectl delete pod mynginx
    2.2、查看Pod的创建信息
    kubectl describe pod pod的名称

    会打印Pod的构建信息,如Pod的构建event事件

    2.3、yaml创建Pod

    创建一个pod.yaml(文件名任意命名),复制一下内容

    • 不知道namespace,默认在default下
    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. labels:
    5. run: mynginx
    6. name: mynginx
    7. # namespace: default
    8. spec:
    9. containers:
    10. - image: nginx
    11. name: mynginx

    应用yaml

    kubectl apply -f pod.yaml

    查看构建信息

    kubectl describe pod mynginx

    删除配置文件创建的pod

    kubectl delete -f pod.yaml

    2.4、使用可视化dashboard创建pod

    把2.3中的代码复制进行:

    之后k8s在创建pod

    2.5、查看pod日志
    • 类似于docker查看容器日志
    kubectl logs pod名字

    上述默认是查看default名称空间下的pod

    指定名称空间获取pod日志:

    kubectl logs pod名字 -n namespace名字
    2.6、日志阻塞式追踪(实时更新日志)

    -n namespace名字:缺省,则表示查询的是default名称空间

    kubectl logs pod名字 -n namespace名字
    2.7、获取pod更完善信息
    kubectl get pod -o wide
    • -o wide:可以写成 -owide
    • 上述默认查询的是default名称空间,可以使用kubectl get pod -o wide -A获取所有pod

    2.8、进入pod
    kubectl exec -it pod名字 -- /bin/bash
    2.9、pod中运行多个容器
    • 多个容器间端口存在冲突时,只会启动第一个容器,后面的容器会报端口冲突错误
    • 一个pod间的网络、存储空间是共享的,容器间可以通过127.0.0.1进行访问
    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. labels:
    5. run: myapp
    6. name: myapp
    7. # namespace: default
    8. spec:
    9. containers:
    10. - image: nginx
    11. name: mynginx
    12. - image: tomcat8.5.68
    13. name: mytomcat

    3、Deployment

    • 部署
    • 控制pod,使pod用于多副本、自愈、扩缩容等能力
    3.1、创建deployment

    语法:

    kubectl create deployment deployment的名字 --image=镜像名称

    eg:

    kubectl create deployment mytomcat --image=tomcat:8.5.68
    3.2、删除deployment

    语法:

    kubectl delete deployment deployment的名字

    eg:

    kubectl delete deployment mytomcat

    与删除pod的区别

    • deployment创建的pod,可以用pod的删除语句去删除这个pod,但是k8s会自动创建下一个pod
    • 只有使用删除deployment语句,才能彻底删除deployment创建的pod
    3.3、多副本

    语法:

    kubectl create deployment deployment的名字 --image=镜像名称 --replicas=pod的数量

    eg:

    kubectl create deployment mytomcat --image=tomcat:8.5.68 --replicas=3

    如下图,创建了3个pod 

    yaml文件配置方式

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. labels:
    5. app: mytomcat
    6. name: mytomcat
    7. spec:
    8. replicas: 3
    9. selector:
    10. matchLabels:
    11. app: mytomcat
    12. template:
    13. metadata:
    14. labels:
    15. app: mytomcat
    16. spec:
    17. containers:
    18. - image: tomcat
    19. name: tomcat
    3.4、扩缩容
    • 其实就是改变deployment下的pod数量
    • 当我们pod在运行期间只有3个,需要增加pod数量去支持访问量时,这个就称为扩容
    • 需要减少pod数量去支持访问量时,这个就称为缩容

    语法:

    kubectl scale deployment/deployment的名字 --replicas=pod的数量

    eg::

    kubectl deployment/mytomcat scale --replicas=5
    3.5、自愈与故障转移

    自愈:deployment下的pod出现问题,k8s会对该pod自动进行重启修复

    故障转移:当一个pod所在的节点宕机后,k8s会把宕机的pod自动拉到其他的node进行运行

    3.7、滚动更新

    假设deployment下有3个pod,这3个pod为同一个镜像应用,当该镜像更新时,需要对k8s的pod进行更新,而滚动更新的作用就是:

    • 能保证镜像更新后,pod能平滑更新到下一个版本

    更新步骤:

    1. k8s接收到滚动更新指令
    2. 启动1个新版本的镜像pod,当该pod启动完成后,k8s会杀掉3个镜像中的一个pod
    3. 然后再启动1个新pod,pod启动完成后,再杀掉1个旧pod
    4. 以此类推,直到新pod全部上线,旧pod全部下线,滚动更新完成

    滚动更新只需要一个指令,即可执行上述步骤:

    语法:

    • --record表示记录下这次更新
    kubectl set image deployment/deployment的名字 原镜像=新镜像 --record

    eg:

    kubectl set image deployment/mytomcat tomcat=tomcat --record

    3.8、命令修改deployment配置
    kubectl edit deployment mytomcat #mytomcat为deployment的名字
    3.9、版本回退

    k8s支持deployment版本回退,且回退是滚动更新的过程!

    回退流程:

    <1>查看deployment的版本列表

    格式:

    kubectl rollout history deployment/deployment的名字

    eg:

    kubectl rollout history deployment/mytomcat

    CHANGE-CAUSE:类似于GIT每次提交的message,只是k8s可以不写(none),在变更deployment的时,使用 --record来保存记录,参考3.7

    <2>检查当前deployment使用的镜像版本

    kubectl get deployment mytomcat -oyaml

    或者

    kubectl get deployment mytomcat -oyaml | grep tomcat
    • tomcat的镜像为tomcat最新版镜像

    <3>查看某个版本的yaml详情

    kubectl rollout history deployment/mytomcat --revision=1
    •  --revision=历史版本的编号

    或者直接查看镜像:

    kubectl rollout history deployment/mytomcat --revision=1 | grep image

     <4>版本回退

    #回退到上次版本

    kubectl rollout undo deployment/mytomcat

    #回退到指定版本
    kubectl rollout undo deployment/mytomcat --to-revision=1

    3.10、工作负载

    除了Deployment,k8s还有 StatefulSet 、DaemonSet 、Job  等 类型资源。我们都称为 工作负载。
    有状态应用使用  StatefulSet  部署,无状态应用使用 Deployment 部署
    官方文档:https://kubernetes.io/zh/docs/concepts/workloads/controllers/


    4、Service

    • 服务
    • 将一组 Pods 公开为网络服务的抽象方法。
    • Pod的服务发现与负载均衡(服务发现指的是能感知同一组pod的上线下线变更,与注册中心一样)
    • 该暴露出来的IP或域名,只能集群内部访问,不能外部访问
    • Service的默认域名为:服务名.所在名称空间.svc,如:mytomcat.default.svc

    不使用service时存在的问题:

    1. 当一个项目需要启动多个pod,每个pod的IP是不同的,假设我们通过某一个pod的IP去访问项目,若该pod宕机后,我们需要手动切换pod的IP(虽然可以使用nginx的负载均衡去实现切换,但是无状态pod的IP是会改变的,除非每次去变更nginx的配置)
    2. 当一个项目存在多个pod时,我们只能去连接某一个pod,并不能把所有的pod的资源使用起来

    Service解决的问题:

    • 把相同标签的一组pod暴露成一个统一访问的服务,我们只需要访问service即可访问标签中的所有pod(负载均衡的方式)
    4.1、暴露Service命令
    kubectl expose deploy deployment的名字 --port=指定暴露的端口 --target-port=pod中需要暴露的端口
    • --port:指定暴露的端口,外部访问时的端口
    • --target-port:pod中需要暴露的端口,一般为pod中应用的端口

    eg:把mytomcat的deployment中,pod的8080端口暴露给service服务8000端口

    kubectl expose deploy mytomcat --port=8000 --target-port=8080
    4.2、获取k8s下的service列表
    kubectl get svc -A

    或者

    kubectl get svc

    4.3、yaml方式生成Service
    1. apiVersion: v1
    2. kind: Service
    3. metadata:
    4. labels:
    5. app:mytomcat
    6. name: mytomcat
    7. spec:
    8. selector:
    9. app: mytomcat #pod的标签
    10. ports:
    11. - port: 8000
    12. protocol: TCP
    13. targetPort: 8080
    • selector.app:pod的标签label,用于给pod分类的
    • pod的标签若不指定,一般默认为deployment的名字
    4.4、获取pod的标签
    kubectl get pod --show-labels

    4.5、Service暴露方式

    默认方式(clusterIP 集群IP访问):

    kubectl expose deployment mytomcat --port=8000 --target-port=8080

    等同于:

    kubectl expose deployment mytomcat --port=8000 --target-port=8080 --type=ClusterIP

    yaml方式:

    1. apiVersion: v1
    2. kind: Service
    3. metadata:
    4. labels:
    5. app: mytomcat
    6. name: mytomcat
    7. spec:
    8. ports:
    9. - port: 8000
    10. protocol: TCP
    11. targetPort: 8080
    12. selector:
    13. app: mytomcat
    14. type: ClusterIP #NodePort集群外访问

    NodePort暴露方式

    kubectl expose deployment mytomcat --port=8000 --target-port=8080 --type=NodePort

    • k8s会自动生成一个提供外部访问的端口
    • NodePort范围在 30000-32767 之间

    • 访问方式:集群任意node节点+端口,即可访问Service

    如:http://111.230.19.178:31634/


    5、上述网络访问总结

    1、节点与节点直接是否能正常通信的判断缘由
    kubectl get node -owide
    • node节点加入k8s是外网IP,证明节点间的通信是没有问题的(就是确保node节点以外网的方式接入的) 

    2、pod的IP访问范围
    • 一般除了搭建k8s时生成的pod,使用机器外网IP或master节点的IP外,其余在k8s集群搭建好的基础上,生成的pod,会使用master初始化时pod-network-cidr的网络范围(需要确保calico的网段与之一致)
    • pod-network-cidr的网络范围:指的是k8s给pod分配的IP地址的范围,这个IP只能集群内部访问!!!
    • 这里的集群内部是指K8S内pod互相访问,而不是k8s节点进行访问!
    • 节点访问pod的IP不属于集群内的访问!!!

    3、Service暴露方式访问的范围
    • 以clusterIP暴露方式的访问范围,指的是集群内的访问!!!不是k8s节点进行访问
    kubectl expose deployment mytomcat --port=8000 --target-port=8080
    • 以NodePort暴露方式的访问范围
    kubectl expose deploy mynginx --port=8000 --target-port=80 --type=NodePort

    因为calico问题,我现在只能在mynginx的工作节点才能访问上述service的IP

    如下(在我的k8s-node1中访问):

    浏览器使用k8s-node1的IP家31522端口:

  • 相关阅读:
    35岁测试工程师现状:被生活、房贷车贷压得喘不过气,哪敢谈什么追求~
    大数据行业现在工作很难找吗?
    使用并查集处理树的路径
    联想ThinkSystem服务器 安装ESXI 7.0 踩坑记录
    【Servlet】这一文详细的讲述了Servlet的知识,呕心沥血,终于文成。
    PCL入门(六):深度图提取边界
    [面试宝典] Linux常见命令及面试题
    AUTOSAR汽车电子嵌入式编程精讲300篇-面向车载CAN网络的路由和ECU刷写方法 (中)
    七夕节赚徽章拉
    “超级 App”正在迎来价值重构的风暴
  • 原文地址:https://blog.csdn.net/weixin_42675423/article/details/134520607