K8S基础笔记

1、namespace

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

查看k8s的所有命名空间

复制代码
kubectl get namespace

或者

复制代码
kubectl get ns

创建名称空间

复制代码
kubectl create ns 名称

或使用yaml方式

  1. 编写yaml

  2. kubectl apply -f yaml文件

    appVersion: v1
    kind: Namespace
    metedata:
    name: hello

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

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

bash 复制代码
#可以yaml文件和yaml文件执行的结果(这里是删除名称空间)
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
bash 复制代码
kubectl run mynginx --image=nginx
  • 没有指定namespace,默认在default下创建的Pod
  • mynginx:Pod的名称
  • --image=nginx:使用nginx镜像去构建该Pod,nginx由于没有指定镜像版本,默认使用最新的

删除Pod

bash 复制代码
kubectl delete pod mynginx
2.2、查看Pod的创建信息
bash 复制代码
kubectl describe pod pod的名称

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

2.3、yaml创建Pod

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

  • 不知道namespace,默认在default下
bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: mynginx
  name: mynginx
#  namespace: default
spec:
  containers:
  - image: nginx
    name: mynginx

应用yaml

bash 复制代码
kubectl apply -f pod.yaml

查看构建信息

bash 复制代码
kubectl describe pod mynginx

删除配置文件创建的pod

bash 复制代码
kubectl delete -f pod.yaml
2.4、使用可视化dashboard创建pod

把2.3中的代码复制进行:

之后k8s在创建pod

2.5、查看pod日志
  • 类似于docker查看容器日志
bash 复制代码
kubectl logs pod名字

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

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

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

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

bash 复制代码
kubectl logs pod名字 -n namespace名字
2.7、获取pod更完善信息
bash 复制代码
kubectl get pod -o wide
  • -o wide:可以写成 -owide
  • 上述默认查询的是default名称空间,可以使用kubectl get pod -o wide -A获取所有pod
2.8、进入pod
bash 复制代码
kubectl exec -it pod名字 -- /bin/bash
2.9、pod中运行多个容器
  • 多个容器间端口存在冲突时,只会启动第一个容器,后面的容器会报端口冲突错误
  • 一个pod间的网络、存储空间是共享的,容器间可以通过127.0.0.1进行访问
bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: myapp
  name: myapp
#  namespace: default
spec:
  containers:
  - image: nginx
    name: mynginx
  - image: tomcat8.5.68
    name: mytomcat

3、Deployment

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

语法:

bash 复制代码
kubectl create deployment deployment的名字 --image=镜像名称

eg:

bash 复制代码
kubectl create deployment mytomcat --image=tomcat:8.5.68
3.2、删除deployment

语法:

bash 复制代码
kubectl delete deployment deployment的名字

eg:

bash 复制代码
kubectl delete deployment mytomcat

与删除pod的区别

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

语法:

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

eg:

bash 复制代码
kubectl create deployment mytomcat --image=tomcat:8.5.68 --replicas=3

如下图,创建了3个pod

yaml文件配置方式

bash 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: mytomcat
  name: mytomcat
spec:
  replicas: 3
  selector:
    matchLabels:
      app: mytomcat
  template:
    metadata:
      labels:
        app: mytomcat
    spec:
      containers:
      - image: tomcat
        name: tomcat
3.4、扩缩容
  • 其实就是改变deployment下的pod数量
  • 当我们pod在运行期间只有3个,需要增加pod数量去支持访问量时,这个就称为扩容
  • 需要减少pod数量去支持访问量时,这个就称为缩容

语法:

复制代码
kubectl scale deployment/deployment的名字 --replicas=pod的数量

eg::

bash 复制代码
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:

bash 复制代码
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
复制代码
apiVersion: v1
kind: Service
metadata:
  labels:
    app:mytomcat
  name: mytomcat
spec:
  selector:
    app: mytomcat    #pod的标签
  ports:
  - port: 8000
    protocol: TCP
    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方式:

复制代码
apiVersion: v1
kind: Service
metadata:
  labels:
    app: mytomcat
  name: mytomcat
spec:
  ports:
  - port: 8000
    protocol: TCP
    targetPort: 8080
  selector:
    app: mytomcat
  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端口:

相关推荐
一尘之中2 分钟前
在 Ubuntu 上安装 Docker 的完整指南(使用国内镜像源)
linux·docker·ai写作
黎明晓月7 分钟前
Redis容器化(Docker)
java·redis·docker
叽里咕噜怪8 分钟前
Kubernetes 操作与项目生命周期管理(初学者详解版)
云原生·容器·kubernetes
企鹅郁金香11 分钟前
使用Docker部署Gitlab和Gerrit (一)
docker·容器·gitlab·gerrit部署
Benny的老巢15 分钟前
Docker环境n8n连接Chrome DevTools Protocol的操作方法
docker·chrome devtools·ai agent·n8n·n8n工作流
秃了也弱了。21 分钟前
云原生 API 网关:apisix使用详解
云原生
可爱又迷人的反派角色“yang”24 分钟前
k8s(三)
linux·运维·网络·docker·容器·kubernetes
三块钱079426 分钟前
nas-群晖docker查询注册表失败解决办法
运维·docker·容器
zhaotiannuo_19989 小时前
渗透测试之docker
运维·docker·容器
Light609 小时前
破局而立:制造业软件企业的模式重构与AI赋能新路径
人工智能·云原生·工业软件·商业模式创新·ai赋能·人机协同·制造业软件