kubernetes入门到精通-02

文章目录

  • 一、kubernetes资源管理
    • kubectl常用的命令
    • 陈述式命令(命令式对象管理)
    • 命令式对象配置
    • 声明式对象配置
  • 二、kubernetes常用组件
    • Namespace
    • pod
    • Label
    • Deployment
    • Service
  • 三、深入理解pod
    • pod相关概念
    • pod核心配置
      • pod基本配置1
      • pod相关配置2
    • pod镜像拉取策略
      • Never
      • IfNotPresent
      • Always
    • pod环境变量
    • 端口相关设置
    • 资源相关配置
    • 启动命令配置
  • 四、kubernetes集群环境重置
  • 五、kubectl如何在工作节点执行
  • 六、kubernetes常见错误
    • 1.在Master节点执行: kubectl get nodes
    • 2.初始化K8S master时报错
    • 3.执行kubeadm init 报错:
    • 4.执行 kubeadm init 报错kubelet-check] The HTTP call equal to ‘curl -sSL http://localhost:10248/healthz‘ fa
    • 5.执行 kubeadm init Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")
    • 6.Unable to connect to the server: dial tcp 192.168.75.163:6443: connect: no route to host
    • 7.kubectl get node 显示 NotReady 解决方法
    • 8.The Pod "mayikt-pod" is invalid: spec.containers[0].ports[0].name: Invalid value: "mayikt-nginx-port": must be no more than 15 characters

一、kubernetes资源管理

kubectl常用的命令

kubectl的命令可分为三类
1.陈述式命令(命令式对象管理) 类似于我们直接在docker 中 docker run 命令
2.陈述式对象配置(命令式对象配置) 类似于类似于 docker-compose.yml
3.声明式对象配置(声明式对象配置)

kubectl是k8s集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署,kubectl命令的语法如下:

kubectl [command] [type] [name] [flags]
comand:指定要对资源执行的操作,例如create、 get、delete
type:指定资源类型,比如deployment、pod、 service
name:指定资源的名称,名称大小写敏感
flags:指定额外的可选参数

kubectl get nodes
kubectl 常用命令
1.kubectl get nodes —查询k8s集群节点
2.kubectl get pod —查看所有的pod
3.kubectl describe pod nginx-6867cdf567-94kcb —查看pod详细内容
4.kubectl cluster-info —查看k8s 集群的信息
5.kubectl version 查看当前k8s 集群的版本

陈述式命令(命令式对象管理)

通过陈述式命令(命令式对象管理) 对namespace/pod操作
pod 是我们k8s 最小单元 容器运行在我们的pod里面
一个pod可以在里面运行n多个不同容器

1.命令形式创建一个namespace
kubectl create namespace mayikt-sit

2.查询所有的namespace
kubectl get ns

3.在mayikt-sit的namespace 下运行一个pod
kubectl run pod --image=nginx -n mayikt-sit

4.查看mayikt-sit下的pod,注意事项 查询pod 需要指定具体命名空间
kubectl get pods -n mayikt-sit
kubectl get pods —默认查询 default namespace

5.查看该pod的详细信息
kubectl describe pod pod-864f9875b9-h467q (错误方式)
需要指定该pod对应的namespace 如果没有指定则会报错
kubectl describe pod pod-864f9875b9-h467q -n mayikt-sit (正确方式)

6.删除该pod
kubectl delete pods pod-864f9875b9-whqt6 -n mayikt-sit
但是删除该pod之后,又重新启动一个新的pod
kubectl get pods -n mayikt-sit
对比发现pod name 名称已经发生变化,然后查看该新的pod详细信息
kubectl describe pod pod-864f9875b9-jdp7k -n mayikt-sit
你会发现ip 也发生了变化。
我们应该通过删除命名空间,则自动会将这些pod删除
kubectl delete ns mayikt-sit

命令式对象配置

命令式对象配置就是使用命令配合配置文件一起来操作k8s资源,类似于我们学习的
docker-compose 定义 yml 配置文件 需要对yaml 配置有一定了解。
kubectl create -f mayikt-pod1.yml 创建资源
kubectl delete -f mayikt-pod1.yml 删除资源
kubectl get-f mayikt-pod1.yml

1.创建 mayikt-pod1.yml

apiVersion: v1
kind: Namespace
metadata:
  name: mayikt-sit #指定的Namespace空间名称 

---
apiVersion: v1
kind: Pod
metadata:
  name: mayikt-nginx-pod    #指定pod的名称
  namespace: mayikt-sit  #指定该pod对应的Namespace
spec:
  containers: 
  - name: mayikt-nginx-container #运行一个nginx容器
    image: nginx:1.17.9  #指定镜像的名称

上传到服务器端
/usr/local 创建一个 mayikt 来演示我们的
mkdir mayikt
执行kubectl create -f mayikt-pod1.yml
创建成功 自动创建Namespace mayikt-sit 和 pod mayikt-nginx-pod
执行 kubectl get ns
执行 kubectl get pods -n mayikt-sit
查看该pod详细信息 kubectl describe pod mayikt-nginx-pod -n mayikt-sit
kubernetes入门到精通-02_第1张图片

该容器运行在 164节点 执行curl 172.17.0.2 说明 pod中容器运行成功

执行get命令,查看资源 kubectl get -f mayikt-pod1.yml
删除delete 命令 kubectl delete -f mayikt-pod1.yml
namespace “mayikt-sit” deleted
pod “mayikt-nginx-pod” deleted
执行 kubectl get ns
再访问该nginx 已经访问不了

声明式对象配置

声明式对象配置跟命令式对象配置很类似,通过命令apply
kubectl apply -f mayikt-pod2.yml
在创建一个mayikt-pod2.yml

apiVersion: v1
kind: Namespace
metadata:
  name: mayikt-sit #指定的Namespace空间名称 

---
apiVersion: v1
kind: Pod
metadata:
  name: mayikt-nginx-pod    #指定pod的名称
  namespace: mayikt-sit  #指定该pod对应的Namespace
spec:
  containers: 
  - name: mayikt-nginx-container #运行一个nginx容器
    image: nginx:1.17.9  #指定镜像的名称

执行:kubectl apply -f mayikt-pod2.yml
查看:pod kubectl get pods -n mayikt-sit
查看pod 详细信息:kubectl describe pod mayikt-nginx-pod -n mayikt-sit
再次执行 kubectl apply -f mayikt-pod2.yml 资源没有发生任何变化
namespace/mayikt-sit unchanged
pod/mayikt-nginx-pod unchanged
未发生变化

修改nginx的版本1.17.8
再次执行:kubectl apply -f mayikt-pod2.yml
pod 是有发生变化的

查看pod 详细信息
kubectl describe pod mayikt-nginx-pod -n mayikt-sit
nginx:1.17.9 改成nginx:1.17.8

总结:
如果资源不存在就创建(create),相当于kubectl create
如果资源已存在,就更新(update),相当于kubectl patch

二、kubernetes常用组件

1.谈谈大家构建k8s集群环境过程常见问题
2.简单谈谈K8S集群架构设计原理
3.谈谈pod 、Namespace、Label、Deployment、Service之间关系
4.pod控制器原理、类型有哪些
5.pod的生命周期
6.实战K8S构建nginx集群环境 弹性扩容与缩容

Namespace

1.Kubernetes 支持多个虚拟集群,它们底层依赖于同一个物理集群。 这些虚拟集群被称为命名空间。可以实现多套环境的资源隔离或者多租户的资源隔离。
2.资源的名称需要在命名空间内是唯一的,但不能跨命名空间。命名空间不能相互嵌套,每个 Kubernetes 资源只能在一个命名空间中。命名空间是在多个用户之间划分集群资源的一种方法
3.k8s集群中的所有的Pod都是可以相互访问的,将两个Pod划分到不同的namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的"组",以方便不同的组的资源进行隔离使用和管理,不同的Namespace下的pod 相互之间是访问不通的。

kubernetes入门到精通-02_第2张图片
执行命令 kubectl get ns 查看所有的 Namespace
1.default 没有指明使用其它命名空间的对象所使用的默认命名空间
2.kube-system Kubernetes 系统创建对象所使用的命名空间
3.kube-public 这个命名空间是自动创建的,所有用户(包括未经过身份验证的用户)都可以读取它。这个命名空间主要用于集群使用,以防某些资源在整个集群中应该是可见和可读的。这个命名空间的公共方面只是一种约定,而不是要求。

创建Namespace
kubectl create ns mayikt-sit

删除Namespace
kubectl delete ns mayikt-sit

pod

Pod是在k8s集群进行管理的最小单元,程序要运行必须部署在容器(docker)中,而容器必须存在于Pod中。
Pod是对(docker)容器的封装,1个Pod中可以存在一个或者多个容器。
1.kubectl create ns mayikt-sit
2.运行一个 nginx pod
kubectl run nginx --image=nginx:1.17.9 --port=80 --namespace=mayikt-sit
3.kubectl get pod -n mayikt-sit 查看命名空间mayikt-sit下的pod
4.查看pod的ip:kubectl get pod -n mayikt-sit -o wide
5.更多pod详细信息:kubectl describe pod nginx-64777cd554-z6hgr -n mayikt-sit
6.删除pod
直接删除pod是删除不成功的 ,pod控制器有会重新启动一个pod
kubectl get pods -n mayikt-sit
kubectl delete pod nginx-64777cd554-z6hgr -n mayikt-sit
继续执行 kubectl get pods -n mayikt-sit
我们将pod控制器删除 这样我们pod就可以删除啦
kubectl get deployment -n mayikt-sit 查询mayikt-sit下的控制器
删除pod控制器
kubectl delete deployment nginx -n mayikt-sit
kubectl get deployment -n mayikt-sit
kubectl get pods -n mayikt-sit
这样的我们的pod就被删除啦

Label

1.Label其实就一对 key/value ,被关联到对象上,比如Pod,标签的使用我们倾向于能够标示对象的特殊特点,Labels的值对系统本身并没有什么含义,只是对用户才有意义。同一个资源对象的labels属性的key必须唯一,label可以附加到各种资源对象上,如Node,Pod,Service,RC等。一个资源拥有多个标签,可以实现不同维度的管理。标签(Label)的组成: key=value。Label可以在创建对象时就附加到对象上,也可以在对象创建后通过API进行额外添加或修改
2.label 必须以字母或数字开头,可以使用字母、数字、连字符、点和下划线,最长63个字符。
3.当相同类型的资源越来越多,对资源划分管理是很有必要,此时就可以使用Label为资源对象 命名,以便于配置,部署等管理工作,提升资源的管理效率。label 作用类似Java包能对不同文件分开管理,让整体更加有条理,有利于维护。
4.通过Label来对对象进行引用。
例如:
1.版本标签:“version”:"“v1”, “version”:“v2”(灰度发布)
2.环境标签:“environment”:“sit”,“environment”:“pre”,“environment”:“prd”

创建一个mayikt-pod3.yml

apiVersion: v1
kind: Namespace
metadata:
  name: mayikt-sit #指定的Namespace空间名称 

---
apiVersion: v1
kind: Pod
metadata:
  name: mayikt-nginx-pod    #指定pod的名称
  namespace: mayikt-sit  #指定该pod对应的Namespace
spec:
  containers: 
  - name: mayikt-nginx-container #运行一个nginx容器
    image: nginx:1.17.9  #指定镜像的名称

执行命令:kubectl create -f mayikt-pod3.yml
查看标签 kubectl get pod -n mayikt-sit --show-labels

在这里插入图片描述
没有标签

为我们的pod打标签
kubectl label pod mayikt-nginx-pod -n mayikt-sit version=1.0
执行命令:查看标签 kubectl get pod -n mayikt-sit --show-labels
kubernetes入门到精通-02_第3张图片
更新标签
kubectl label pod mayikt-nginx-pod -n mayikt-sit version=2.0 --overwrite
查看标签 kubectl get pod -n mayikt-sit --show-labels

再启动一个新的pod,创建一个文件mayikt-pod4.yml

apiVersion: v1
kind: Namespace
metadata:
  name: mayikt-sit #指定的Namespace空间名称 

---
apiVersion: v1
kind: Pod
metadata:
  name: mayikt-nginx-pod2    #指定pod的名称
  namespace: mayikt-sit  #指定该pod对应的Namespace
spec:
  containers: 
  - name: mayikt-nginx-container #运行一个nginx容器
    image: nginx:1.17.9  #指定镜像的名称

执行: kubectl create -f mayikt-pod4.yml
Error from server (AlreadyExists): error when creating “mayikt-pod4.yml”: namespaces “mayikt-sit” already exists
该错误可以忽略 因为该namespaces 已经存在。
执行kubectl get pod -n mayikt-sit -o wide
查看标签kubectl get pod -n mayikt-sit --show-labels
修改标签 kubectl label pod mayikt-nginx-pod2 -n mayikt-sit version=3.0 --overwrite
查看标签 kubectl get pod -n mayikt-sit --show-labels

kubernetes入门到精通-02_第4张图片

配置文件的形式指定:

apiVersion: v1
kind: Namespace
metadata:
  name: mayikt-pre #指定的Namespace空间名称 

---
apiVersion: v1
kind: Pod
metadata:
  name: mayikt-pre    #指定pod的名称
  namespace: mayikt-pre  #指定该pod对应的Namespace
  labels:
    version: "8.0"  #指定labels标签
    env: "sit"
spec:
  containers: 
  - name: mayikt-nginx-container #运行一个nginx容器
    image: nginx:1.17.9  #指定镜像的名称

执行命令:kubectl create -f mayikt-pod5.yml
查看标签: kubectl get pod -n mayikt-pre --show-labels
搜索标签
kubectl get pods -l “version=2.0” -n mayikt-sit --show-labels

Deployment

kubernetes入门到精通-02_第5张图片
Deployment为Pod和Replica Set提供声明式更新。
你只需要在 Deployment 中描述您想要的目标状态是什么,Deployment controller 就会帮您将 Pod 和ReplicaSet 的实际状态改变到您的目标状态。您可以定义一个全新的 Deployment 来创建 ReplicaSet 或者删除已有的 Deployment 并创建一个新的来替换。
注意:您不该手动管理而是由 Deployment 创建的 Replica Set,否则您就篡越了 Deployment controller 的职责!下文罗列了 Deployment 对象中已经覆盖了所有的用例。如果未有覆盖您所有需要的用例,请直接在 Kubernetes 的代码库中提 issue。

在k8s中,Pod是 最小的控制单元,我们的k8s不会直接控制Pod,而是通过Pod控制器来完成的。Pod控制器用于pod的管理,确保pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或重建pod。

清空之前的环境 删除之前的 命名空间
kubectl delete ns mayikt-sit
执行命令 创建命名空间 kubectl create ns mayikt-sit
创建nginx 集群 3个副本

--image     指定pod的镜像
--port      指定端口
--replicas  指定创建pod数量
--namespace 指定namespace

kubectl run nginx --image=nginx:1.17.9 --port=80 --replicas=3 --namespace=mayikt-sit
查看 pod的 ip 信息 kubectl get pod -n mayikt-sit -o wide
在这里插入图片描述
kubectl describe deployment nginx -n mayikt-sit

kubernetes入门到精通-02_第6张图片
如删除一个pod
kubectl delete pod nginx-5c9b49c46-df5tc -n mayikt-sit
kubectl get pod -n mayikt-sit -o wide
删除之后 通过控制器自动有创建的一个pod
kubectl describe pod nginx-5c9b49c46-zqv6g -n mayikt-sit
172.17.0.1 冲突原因是因为 在不同节点部署容器 只是容器ip冲突 但是它们分别部署在
164和165节点
kubectl describe pod nginx-5c9b49c46-n52dl -n mayikt-sit

Service

service是k8s中的一个重要概念,主要是提供负载均衡和服务自动发现
因为Pod IP会随着Pod的重建产生变化,可以使用Service提供的ip
来访问到我们的pod。

kubernetes入门到精通-02_第7张图片1.查看当前nginx的deployment
kubectl describe deployment nginx -n mayikt-sit
2.创建service
kubectl expose deploy nginx --name=mayikt-service01 --type=ClusterIP --target-port=80 -n mayikt-sit
3.查看命名空间下的service
kubectl get service -n mayikt-sit
4.查看命名空间下的service详细内容
kubectl get service -n mayikt-sit -o wide
在这里插入图片描述
我们可以通过 CLUSTER-IP(集群的IP),这就是service的IP,在Service的生命周期中,地址是不会变动的。
5.然后在工作节点上执行
curl 10.99.114.200

kubernetes入门到精通-02_第8张图片
6.以上方式无法外部,我们可以外部访问方式
只需要将–type 修改为NodePort
kubectl expose deploy nginx --name=mayikt-service02 --type=NodePort --target-port=80 -n mayikt-sit

7.在执行查看 该service
kubectl get pods,service -n mayikt-sit

在这里插入图片描述
8.打开浏览器使用工作节点的Ip
kubernetes入门到精通-02_第9张图片
外部就可以访问啦!

9.删除service
service svc
kubectl delete svc mayikt-service01 -n mayikt-sit
kubectl delete svc mayikt-service02 -n mayikt-sit

10.kubectl get svc -n mayikt-sit 查看service
kubernetes入门到精通-02_第10张图片
10.但是这种方式很麻烦我们可以直接定义成配置文件
创建一个 mayikt-serivce01.yml

apiVersion: v1
kind: Service
metadata :
  name: mayikt-service01   ## Service名称
  namespace: mayikt-sit  ## 命名空间 mayikt -sit
spec:
  clusterIP: 10.99.114.201
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    run: nginx
  type: ClusterIP

11.执行 kubectl create -f mayikt-service-1.yml
12.执行 kubectl get pods,service -n mayikt-sit
13.工作节点上执行 curl 192.168.75.170

创建: kubectl create -f mayikt-service-1.yml
删除: kubectl delete -f mayikt-service-1.yml
筛选标签: kubectl get pods -l “version=2.0” -n mayikt-sit --show-labels

三、深入理解pod

pod相关概念

k8s中最小调度单元 ,一个pod里面可以有n多个不同的容器
1.Pod实际上是容器的集合,是k8s中最小调度单元
2.一个pod里面可以有n多个不同的容器
3.一个pod内的容器之间共享相同的pod ip网络
4.Pause容器,这是每个Pod都会有的一个根容器
5.可以在根容器上设置ip地址,其它容器都共享相同Ip (Pod IP),以实现Pod内部的网路通信
,Pod内部的通讯,Pod的之间的通讯采用虚拟二层网络技术来实现。

kubernetes入门到精通-02_第11张图片
pod详细配置清单

apiVersion: v1      #必填,版本号,例如v1
kind: Pod           #必填,资源类型,例如Pod、service、Deployment
metadata:           #必填,元数据
  name: mayikt-pod  #必填,Pod名称
  namespace: mayikt-namespace01 #Pod所属的命名空间, 默认为”default"
  labels:           #自定义标签列表
    - name: v1
spec:               #必填,Pod中容器的详细定义
  containers:       #必填 , Pod中容器列表
    - name: mayikt-container01  #必填,容器名称
      image: nginx:1.7.9 #必填, 容器的镜像名称
      imagePullPolicy: [ Always Never |IfNotPresent] #获取镜像的策略
      command: [string] #容器的启动命令 列表,如不指定,使用打包时使用的启动命令
      args: [string]    #容器的启动命令参数列表
      workingDir: string #容器的工作目录
      volumeMounts:      #挂载到容器内部的存储卷配置
      - name: string     #引用pod定义的共享存储卷的名称,需用volumes[ ]部分定义的的卷名
        mountPath: string #存储卷在容器内mount的绝对路径,应少于512字符
        read0nly: boolean #是否为只读模式
      ports: #需要暴露的端口库号列表
      - name: string   #端口的名称
        containerPort: int #容器需要 监听的端口号
        hostPort: int   #容器所在主机需要监听的端口号,默认与Container相同
        protocol: string  #控端口协议,支持TCP和UDP,默认TCP
      env:      #容器运行前需设置的环境变量列表
      - name: string    #环境变量名称
        value: string #环境变量的值
      resources: #资源限制和请求的设置
        limits: #资源限制的设置
          cpu: string  #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
          memory: string #内存限制, 单位可以为Mib/Gib,将用于docker run --memory参数
        requests: #资源请求的设置
          cpu: string     #Cpu请求,容器启动的初始可用数量
          memory: string #内存请求,容器启动时的初始可用数量
      lifecycle: #生命周期钩子
          postStart: #容器启动后立即执行此钩子,如果执行失败,会根据重启策略进行重启
          preStop: #容器终止前执行此钩子,无论结果如何,容器都会终止
      livenessProbe: #树对Pod内各容器健康检查的设置, 当探测无响应几次后将自动重启该容器
        exec:    #对Pod容器内检查方式设置为exec方式
          command: [string] #exec方式需要 制定的命令或脚本
        httpGet:     #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
          path: string
          port: number
          host: string
          scheme: string
          HttpHeaders:
          - name: string
            value: string
        tcpSocket: #对Pod内个容器 健康检查方式设置为tcpSocket方式
           port: number

上面配置内容示例

apiVersion: v1 # 必选,API的版本号
kind: Pod # 必选,类型Pod
metadata: # 必选,元数据即基础信息
name: nginx # 必选,符合RFC 1035规范的Pod名称
namespace: web-testing # 可选,不指定默认为default,Pod所在的命名空间
labels: # 可选,标签选择器,一般用于Selector
- app: nginx
annotations: # 可选,注释列表
- app: nginx
spec: # 必选,用于定义容器的详细信息
containers: # 必选,容器列表

name: nginx # 必选,符合RFC 1035规范的容器名称
image: nginx:v1 # 必选,容器所用的镜像的地址

imagePullPolicy: Always # 可选,镜像拉取策略
镜像拉取策略分三种:
Always不管镜像存不存在本地都拉取(默认)
Nerver 不管镜像存不存在本地都不拉取
IfNotpresent 本地有镜像不拉取,没有就拉取

workingDir: /usr/share/nginx/html # 可选,容器的工作目录
volumeMounts: # 可选,存储卷配置

name: webroot # 存储卷名称
mountPath: /usr/share/nginx/html # 挂载目录
readOnly: true # 只读
ports: # 可选,容器需要暴露的端口号列表

name: http # 端口名称
containerPort: 80 # 端口号
protocol: TCP # 端口协议,默认TCP
env: # 可选,环境变量配置

name: TZ # 变量名
value: Asia/Shanghai
name: LANG
value: en_US.utf8
resources: # 可选,资源限制和资源请求限制
limits: # 最大限制设置
cpu: 1000m
memory: 1024MiB
requests: # 启动所需的资源
cpu: 100m
memory: 512MiB
readinessProbe: # 可选,容器状态检查
httpGet: # 检测方式
path: / # 检查路径
port: 80 # 监控端口
timeoutSeconds: 2 # 超时时间
initialDelaySeconds: 60 # 初始化时间
livenessProbe: # 可选,监控状态检查
exec: # 检测方式
command:
- cat
- /health
httpGet: # 检测方式
path: /_health
port: 8080
httpHeaders:
- name: end-user
value: jason
tcpSocket: # 检测方式
port: 80
initialDelaySeconds: 60 # 初始化时间
timeoutSeconds: 2 # 超时时间
periodSeconds: 5 # 检测间隔
successThreshold: 2 # 检查成功为2次表示就绪
failureThreshold: 1 # 检测失败1次表示未就绪
securityContext: # 可选,限制容器不可信的行为
provoleged: false
restartPolicy: Always # 可选,默认为Always
nodeSelector: # 可选,指定Node节点
region: subnet7
imagePullSecrets: # 可选,拉取镜像使用的secret

name: default-dockercfg-86258
hostNetwork: false # 可选,是否为主机模式,如是,会占用主机端口
volumes: # 共享存储卷列表

name: webroot # 名称,与上述对应
emptyDir: {} # 共享卷类型,空
hostPath: # 共享卷类型,本机目录
path: /etc/hosts
secret: # 共享卷类型,secret模式,一般用于密码
secretName: default-token-tf2jp # 名称
defaultMode: 420 # 权限
configMap: # 一般用于配置文件
name: nginx-conf
defaultMode: 420

查看一级属性
kubectl explain pod — 查看一级属性
kubectl explain pod.metadata ----查看二级属性
kubectl explain pod.metadata.namespace----查看三级属性

在k8s中 一级属性 主要包含5个核心部分
1.apiVersion 版本,#必填,版本号,例如v1 由k8s内部定义, 版本号是通过kubectl api-versions 查询
2.kind 类型,必填,资源类型,例如Pod、service、Deployment等,通过kubectl api-resources查询
3.metadata <0bject> 元数据,主要是资源标识和说明,常用的有name、namespace、 labels等
4.spec 描述 对各种资源配置的详细描述
5.status 状态信息,需要我们定义 由k8s自动生成的

例如:
1.创建一个命名空间
kubectl create ns mayikt-sit
2.创建一个pod
kubectl run nginx --image=nginx:1.17.9 --port=80 --namespace=mayikt-sit
kubectl get pods -n mayikt-sit
kubectl get pods -n mayikt-sit nginx-5c9b49c46-7nqfq -o yaml 以yml格式展示
kubernetes入门到精通-02_第12张图片
spec详细配置:
1.containers <[]0bject> 容器列表, 一个pod中可以有n多个不同的容器 用于定义容器的详细信息
2.nodeName 指定该pod运行到具体的node节点,根据nodeName的值将pod调度到指定的Node节点上
例如:node1 :192.168.110.1 node2 :192.168.110.2
3.nodeSelector 根据标签的形式调度
4.hostNetwork 是否使用主机网络模式, 默认为false 如果设置为true,表示使用宿主机网络共享 容易产生端口冲突
5.volumes <[]0bject> 存储卷,用于定义Pod上面挂在的存储信息
6.restartPolicy Pod在遇到故障的时候重启策略

pod核心配置

pod基本配置1

apiVersion: v1
kind: Pod # 类型为pod
metadata:
  name: mayikt-pod01
  namespace: mayikt-sit
  labels:
    user: v1 ## 标签值
spec:
  containers:
  - name: nginx ##容器1
    image: nginx:1.17.9
  - name: mayikt-tomcat  ##容器2
    image: tomcat:8

1.kubectl delete ns mayikt-sit
2.kubectl create ns mayikt-sit
3.kubectl create -f mayikt-pod-info02.yml
4.
kubectl describe pods -n mayikt-sit
kubectl get pods -n mayikt-sit

pod相关配置2

apiVersion: v1
kind: Pod # 类型为pod
metadata:
  name: mayikt-pod01
  namespace: mayikt-sit
  labels:
    user: v1 ## 标签值
spec:
  containers:
  - name: nginx1 ##容器1
    image: nginx:1.17.9
  - name: nginx2 ##容器2
    image: nginx:1.17.9

1.kubectl delete ns mayikt-sit
2.kubectl create ns mayikt-sit
3.kubectl create -f mayikt-pod-info02.yml

kubectl describe pods -n mayikt-sit
kubectl get pods -n mayikt-sit

pod内的容器共享相同的ip和端口空间 启动两个nginx 则端口冲突 第二个nginx 会不断重试
重试次数5次。

pod镜像拉取策略

apiVersion: v1
kind: Pod # 类型为pod
metadata:
  name: mayikt-pod01
  namespace: mayikt-sit
  labels:
    user: v1 ## 标签值
spec:
  containers:
  - name: nginx1 ##容器1
    image: nginx:1.17.9
    imagePullPolicy: IfNotPresent #用于设置镜像拉取策略
  - name: nginx2 ##容器1
    image: nginx:1.17.9

1.Always: 每次都是从远程仓库拉取镜像
2.IfNotPresent: 如果本地有该镜像则使用本地,如果本地没有该镜像则使用远程
3.Never: 只使用本地镜像,不去远程仓库拉取,本地没有该镜像则会报错

Never

只使用本地镜像,不去远程仓库拉取,本地没有该镜像则会报错
1.在node(工作节点)上执行 docker images
2.将工作节点上的nginx镜像删除
kubectl delete ns mayikt-sit 我们需要先删除 mayikt-sit命名空间 则会停止nginx容器
3.在工作节点上执行
docker rmi nginx:1.17.9
docker rmi nginx:latest

Never: 只使用本地镜像,不去远程仓库拉取,本地没有该镜像则会报错

apiVersion: v1
kind: Pod # 类型为pod
metadata:
  name: mayikt-pod01
  namespace: mayikt-sit
  labels:
    user: v1 ## 标签值
spec:
  containers:
  - name: nginx1 ##容器1
    image: nginx:1.17.9
    imagePullPolicy: Never #用于设置镜像拉取策略

kubectl create ns mayikt-sit
kubectl create -f mayikt-pod-info02.yml
kubectl describe pods -n mayikt-sit
kubectl get pods -n mayikt-sit

IfNotPresent

如果本地有该镜像则使用本地,如果本地没有该镜像则使用远程
1.在node(工作节点)上执行 docker images
2.将工作节点上的nginx镜像删除
kubectl delete ns mayikt-sit 我们需要先删除 mayikt-sit命名空间 则会停止nginx容器
3.在工作节点上执行
docker rmi nginx:1.17.9
docker rmi nginx:latest

apiVersion: v1
kind: Pod # 类型为pod
metadata:
  name: mayikt-pod01
  namespace: mayikt-sit
  labels:
    user: v1 ## 标签值
spec:
  containers:
  - name: nginx1 ##容器1
    image: nginx:1.17.9
    imagePullPolicy: IfNotPresent #用于设置镜像拉取策略

kubectl create ns mayikt-sit
kubectl create -f mayikt-pod-info03.yml
kubectl describe pods -n mayikt-sit
kubectl get pods -n mayikt-sit
第一次 从远处下载镜像
删除该命名空间 从新创建pod
kubectl delete ns mayikt-sit
kubectl create ns mayikt-sit
kubectl create -f mayikt-pod-info03.yml
kubectl describe pods -n mayikt-sit
kubectl get pods -n mayikt-sit
第二次就没有从远处下载镜像

Always

每次都是从远程仓库拉取镜像
1.在node(工作节点)上执行 docker images
2.将工作节点上的nginx镜像删除
kubectl delete ns mayikt-sit 我们需要先删除 mayikt-sit命名空间 则会停止nginx容器
3.在工作节点上执行
docker rmi nginx:1.17.9
docker rmi nginx:latest

apiVersion: v1
kind: Pod # 类型为pod
metadata:
  name: mayikt-pod01
  namespace: mayikt-sit
  labels:
    user: v1 ## 标签值
spec:
  containers:
  - name: nginx1 ##容器1
    image: nginx:1.17.9
    imagePullPolicy: Always #用于设置镜像拉取策略
  - name: nginx2 ##容器1
    image: nginx:1.17.9

kubectl create ns mayikt-sit
kubectl create -f mayikt-pod-info03.yml
kubectl describe pods -n mayikt-sit
kubectl get pods -n mayikt-sit

第一次运行pod和第二次运行pod都去远程拉了镜像
kubectl delete ns mayikt-sit
kubectl create ns mayikt-sit
kubectl create -f mayikt-pod-info03.yml
kubectl describe pods -n mayikt-sit
kubectl get pods -n mayikt-sit

pod环境变量

apiVersion: v1
kind: Pod # 类型为pod
metadata:
  name: mayikt-pod01
  namespace: mayikt-sit
  labels:
    user: v1 ## 标签值
spec:
  containers:
  - name: nginx ##容器1
    image: nginx:1.17.9
    env: #设置环境变量列表
    - name: "username"
      value: "mayikt"
    - name: "age"
      value: "22"

1.kubectl delete ns mayikt-sit
2.kubectl create ns mayikt-sit
3.kubectl create -f mayikt-pod-info04.yml
4.
kubectl describe pods -n mayikt-sit
kubectl get pods -n mayikt-sit
5.进入 pod里面 容器
kubectl exec -it mayikt-pod01 -n mayikt-sit -c nginx /bin/sh
kubectl exec -it pod的名称 -n 命名空间 -c 容器名称 /bin/sh
输入echo $username
输入echo $age

端口相关设置

   name   <string> # 端口的名称,name在pod中是唯一的不允许重复
   containerPort<integer> #容器要暴露的端口 (0
   hostPort <integer> #容器要映射到主机上的端口
   hostIP   <string> # 容器要映射到主机的IP(-般省略)
   protocol  <string> # 端口协议,必须是UDP、TCP或SCTP。 默认为“TCP"。
apiVersion: v1
kind: Pod # 类型为pod
metadata:
  name: mayikt-pod01
  namespace: mayikt-sit
  labels:
    user: v1 ## 标签值
spec:
  containers:
  - name: nginx ##容器1
    image: nginx:1.17.9
    env: #设置环境变量列表
    - name: "username"
      value: "mayikt"
    - name: "age"
      value: "22"
    ports: #设置容器暴露的端口列表
    - name: mayikt-port
      containerPort: 80
      protocol: TCP

1.kubectl delete ns mayikt-sit
2.kubectl create ns mayikt-sit
3.kubectl create -f mayikt-pod-info05.yml

kubectl describe pods -n mayikt-sit
kubectl get pods -n mayikt-sit

资源相关配置

可以通过资源配置 pod对应的 cpu核数、内存配置等
1.limits: 限制容器运行时的最大占用资源,当容器占用资源超过limits设置的值时会被终止,并进行重启;
2.requests :用于设置限制容器需要的最小资源,如果环境资源不够,容器则将无法启动
cpu: 核心数数
memory: 内存大小,可以使用Gi、Mi、G、M等形式

apiVersion: v1
kind: Pod # 类型为pod
metadata:
  name: mayikt-pod01
  namespace: mayikt-sit
  labels:
    user: v1 ## 标签值
spec:
  containers:
  - name: nginx ##容器1
    image: nginx:1.17.9
    resources: #资源配额
      limits:  #限制资源(上限) 最大资源限制
        cpu: "2" #限制 CPU核心线程数
        memory: "4Gi" #内存限制
      requests: #请求资源(下限) 最小资源限制
        cpu: "1" # CPU限制,单位是core数
        memory: "5Mi" # 内存限制

1.kubectl delete ns mayikt-sit
2.kubectl create ns mayikt-sit
3.kubectl create -f mayikt-pod-info04.yml

kubectl describe pods -n mayikt-sit
kubectl get pods -n mayikt-sit

演示内存不足
kubectl delete ns mayikt-sit
kubectl create ns mayikt-sit

apiVersion: v1
kind: Pod # 类型为pod
metadata:
  name: mayikt-pod01
  namespace: mayikt-sit
  labels:
    user: v1 ## 标签值
spec:
  containers:
  - name: nginx ##容器1
    image: nginx:1.17.9
    resources: #资源配额
      limits:  #限制资源(上限) 最大资源限制
        cpu: "2" #限制 CPU核心线程数
        memory: "10Gi" #内存限制
      requests: #请求资源(下限) 最小资源限制
        cpu: "1" # CPU限制,单位是core数
        memory: "10Gi" # 内存限制

kubernetes入门到精通-02_第13张图片

启动命令配置

容器启动成功之后 可以执行一些脚本
创建一个mayikt-pod01
kubectl delete ns mayikt-sit
kubectl create ns mayikt-sit

apiVersion: v1
kind: Pod
metadata:
  name: mayikt-pod01
  namespace: mayikt-sit
spec:
  containers:
  - name: nginx
    image: nginx:1.17.9 
  - name: busybox
    image: busybox:1.30

执行kubectl create -f pod-initcontainer-demo01.yml
kubectl get pods -n mayikt-sit 查看pod信息 busybox停止了
kubectl describe pods -n mayikt-sit

这是因为busybox容器启动后,它会自动关闭,我们通过启动命令写脚本,让busybox一直在运行。

apiVersion: v1
kind: Pod
metadata:
  name: mayikt-pod01
  namespace: mayikt-sit
spec:
  containers:
  - name: nginx
    image: nginx:1.17.9 
  - name: busybox
    image: busybox:1.30
    command: [ "/bin/sh","-c","while true;do  sleep 3; done;"]

“/bin/sh”,“-C”,使用sh执行命令 一直死循环 while true;do sleep 3; done;
为了避免cpu飙高的问题 休眠3s时间。

四、kubernetes集群环境重置

1.需要在每台节点执行 kubeadm reset
2.在主节点 执行 rm -rf $HOME/.kube
3.直接回到k8s 初始化流程

五、kubectl如何在工作节点执行

kubectl的运行在工作节点是需要额外进行配置的,它的配置文件是$HOME/.kube,如果想要在node节点运行此命令,需要将master上的.kube文件复制到node节点上,即在master节点上执行下面操作:

scp -r ~/.kube node2:~/

允许在node1节点上执行kubectl get nodes

六、kubernetes常见错误

1.在Master节点执行: kubectl get nodes

报错:
The connection to the server localhost:8080 was refused - did you specify the right host or port?
原因:kubenetes master没有与本机绑定,集群初始化的时候没有设置
在Master节点执行 export KUBECONFIG=/etc/kubernetes/admin.conf

2.初始化K8S master时报错

The HTTP call equal to ‘curl -sSL http://localhost:10248/healthz‘ failed with error: Get “http://loc
journalctl -xeu kubelet

3.执行kubeadm init 报错:

[ERROR FileAvailable–etc-kubernetes-manifests-kube-scheduler.yaml]: /etc/kubernetes/manifests/kube-scheduler.yaml already exists

kubeadm reset 重置即可,再执行 kubeadm init
注意:kubeadm reset 重置 需要在 主节点执行 rm -rf $HOME/.kube

4.执行 kubeadm init 报错kubelet-check] The HTTP call equal to ‘curl -sSL http://localhost:10248/healthz‘ fa

journalctl -xeu kubelet -l 查看具体错误日志 在根据具体报错日志分析

5.执行 kubeadm init Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of “crypto/rsa: verification error” while trying to verify candidate authority certificate “kubernetes”)

你在执行 kubeadm reset命令后没有删除创建的 $HOME/.kube目录
rm -rf $HOME/.kube

6.Unable to connect to the server: dial tcp 192.168.75.163:6443: connect: no route to host

kubectl cluster-info —查询集群信息
Unable to connect to the server: dial tcp 192.168.75.163:6443: connect: no route to host
主节点的ip地址发生了变化 变成了 192.168.75.166:6443
kubeadm reset 重置即可,再执行 kubeadm init

7.kubectl get node 显示 NotReady 解决方法

解决方法:
查看日志 tail -f /var/log/message
发现是防火墙问题。处理方法:
关闭各个节点的防火墙:
systemctl status firewalld
systemctl stop firewalld
systemctl enable firewalld
重启node节点:
[root@k8s_node02 bin]# systemctl daemon-reload
[root@k8s_node02 bin]# systemctl restart docker
[root@k8s_node02 bin]# systemctl restart kubelet

8.The Pod “mayikt-pod” is invalid: spec.containers[0].ports[0].name: Invalid value: “mayikt-nginx-port”: must be no more than 15 characters

原因是名称太长

    ports:
    - name: mayikt-nginx-port
      containerPort: 80
    ports:
    - name: nginx-port
      containerPort: 80      

9.执行kubectl get nodes 显示 节点ip 不是host文件指定的名称 则直接重启虚拟机
重置节点即可。

你可能感兴趣的:(大数据&运维实战,后端,kubernetes,docker,运维)