K8S相关基础

基础命令-kubectl

查看命令

## 查看集群信息
kubectl cluster-info
kubectl cluster-info dump

## 查看集群各服务信息
kubectl get cs

## 查看集群证书请求信息
kubectl get csr

## 批准证书
kubectl certificate approve node-csr-GOt-4QjBYgU9iN0V05ZCOxmK8wfwve50u_n0erxEeCc

## 查看k8s集群节点
kubectl get node

## 
kubectl get sa --all-namespaces

## 
kubectl  describe sa  --all-namespaces

##
kubectl get rolebinding --all-namespaces

## 列出所有已存在资源
kubectl get all

## 列出指定命名空间下已存在资源
kubectl get all -n kube-system

## 列出所有命名空间
kubectl get ns

## 查看k8s集群default命名空间下的pod
kubectl get pod

## 查看指定命名空间下的pod
kubectl get pod -n kube-system

## 查看k8s集群所有命名空间下的pod
kubectl get pod --all-namespaces

## 查看default命名空间下pod运行信息
kubectl get pod -o wide

## default命名空间下查看指定pod运行信息
kubectl get pod/nginx -o wide

## 查看所有命名空间下pod运行信息
kubectl get pod --all-namespaces -o wide

## 查看default命名空间下指定pod详细信息
kubectl describe pod/nginx

## 查看所有命名空间下pod详细信息
kubectl describe --all-namespaces pod

## 查看指定命名空间下pod详细信息
kubectl describe -n default pod/nginx
kubectl describe -n kube-system  pod/kube-flannel-ds-amd64-nw6md

## 查看ip和端口
kubectl get ep

## 查看标签
kubectl get pod --show-labels

## 通过标签查看pod
kubectl get pod -n web -l run=nginx

## 发布服务
kubectl expose pod/nginx --port=88 --target-port=80 --type=NodePort

## 查看指定pod日志
kubectl logs pod/nginx

## 查看服务发布信息
kubectl get svc

kubectl explain --help

关键参数

get: 获取相关信息,后面可以加-o wide

describe: 获取详细信息

-n: 指定命名空间

-l: 指定标签,例如web=nginx

操作命令

在这里插入图片描述

## 授权帐号
kubectl create clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper \
--user=kubelet-bootstrap

## 批准证书
kubectl certificate approve node-csr-GOt-4QjBYgU9iN0V05ZCOxmK8wfwve50u_n0erxEeCc

## 创建命名空间
kubectl create namespace web

## 创建一个nginx示例并指定web命名空间
kubectl run nginx -n web --image=nginx 

## 查看指定命名空间下pod详细信息
kubectl describe -n web pod/nginx

# 编辑pod/nginx
kubectl edit -n web pod/nginx

## 创建一个deployment
kubectl create deployment nginx --image=nginx

## 发布
kubectl expose deployment/nginx --port=80 --type=NodePort --target-port=80 --name=service-nginx

# 给容器添加标签
kubectl label -n web pod/nginx env_role=nginx

## 进入容器
kubectl exec -n web pod/nginx -c nginx -it -- bash -il

## 发布服务 --name=服务名称
kubectl expose -n web pod/nginx --port=88 --target-port=80 --type=NodePort --name=nginx-service

## 查看发布服务详细信息
kubectl describe -n web svc/nginx-service

#删除pod(有deploy时直接删除depoly)
kubectl delete -n web pod/nginx

#删除发布的服务
kubectl delete -n web svc/nginx-service

## 更新镜像
kubectl set image -n web pod/nginx nginx=nginx:1.12
## 更新镜像,并记录事件
kubectl set image -n web pod/nginx nginx=nginx:1.13 --record

pod/nginx image updated
## 或者
kubectl edit -n web pod/nginx
# 修改
  containers:
  - image: nginx:1.13

//不指定-n就是默认命名空间default

kubectl run busybox --image=busybox --command -- ping www.baidu.com

## deployment相关操作
# 查看deploy信息-指定命名空间
kubectl get deploy -n kubernetes-dashboard
# 查看指定pod详细信息
kubectl describe deploy/kubernetes-dashboard -n kubernetes-dashboard
# 设置副本为2,并记录
kubectl scale deploy kubernetes-dashboard -n kubernetes-dashboard --replicas=1 --record

## rollout 用法
# 查看发布状态
kubectl rollout status deploy/kubernetes-dashboard -n kubernetes-dashboard

# 通过rollout history查看操作记录
kubectl rollout history deploy/kubernetes-dashboard -n kubernetes-dashboard

# 通过rollout undo回滚-默认回滚到上一个版本
kubectl rollout undo deploy/kubernetes-dashboard -n kubernetes-dashboard
# 回滚到指定版本
kubectl rollout undo deploy/kubernetes-dashboard -n kubernetes-dashboard --to-revision=2

部署相关

# 应用
kubectl apply -f  xxxx.yaml
# 创建
kubectl create -f xxxx.yaml
# 删除
kubectl delete -f xxxxx.yaml
# 重新生成=delete+create
kubectl replace -f xxxxx.yaml

YAML文件配置

## 要使用最新的版本
kubectl api-versions

示例:

编辑deploy.yaml
vim nginx-depolyment.yaml
apiVersion: apps/v1               #当前格式的版本
kind: Deployment                 #当前创建资源的类型, 当前类型是Deployment
metadata:                        #当前资源的元数据
  name: nginx-deployment             #当前资源的名字 是元数据必须的项
  namespace: web
  labels:
    web: nginx
spec:                            #是当前Deployment的规格说明
  replicas: 3                    #指当前创建的副本数量 默认不填 默认值就为‘1’
  selector:
   matchLabels:
     app: nginx
  template:                      #定义pod的模板
    metadata:                    #当前pod的元数据
      labels:                    #至少顶一个labels标签,可任意创建一个 key:value
        app: nginx
    spec:                        #当前pod的规格说明
      containers:                #容器
      - name: nginx              #是容器的名字容器名字是必须填写的
        image: nginx:1.16        #镜像 镜像的名字和版本
        ports:
        - containerPort: 80
编辑service.yaml
vim nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: web
  labels:
    web: nginx
spec:
  selector:
    app: nginx
  ports:
  - port: 88
    targetPort: 80
    nodePort: 30008
  type: NodePort

注意: 这里的spec下的selector要和deployment.yaml中的对应上,nodePort端口要在aipserver配置文件里设置的端口范围之内

部署

## 部署        
kubectl create -f nginx-depolyment.yaml
kubectl create -f nginx-service.yaml
## 查看部署信息
get all -n web
NAME                                    READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-767cbb69b8-482j2   1/1     Running   0          3m35s
pod/nginx-deployment-767cbb69b8-8prkz   1/1     Running   0          3m35s
pod/nginx-deployment-767cbb69b8-mrbsj   1/1     Running   0          3m35s

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   3/3     3            3           3m35s

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deployment-767cbb69b8   3         3         3       3m35s

## 通过标签查看deploy
kubectl get deploy -n web -l web=nginx
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           11m

## 查看服务发布情况
kubectl get svc -n web -l web=nginx
NAME            TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
nginx-service   NodePort   10.0.0.116   <none>        88:30627/TCP   29s

kubectl describe svc -n web -l web=nginx
Name:              nginx-service
Namespace:         web
Labels:            web=nginx
Annotations:       <none>
Selector:          app=nginx
Type:              ClusterIP
IP:                10.0.0.116
Port:              <unset>  88/TCP
TargetPort:        80/TCP
Endpoints:         10.244.1.12:80,10.244.2.21:80,10.244.2.22:80
Session Affinity:  None
Events:            <none>

## 访问测试
curl http://10.0.0.116:88

## 更新版本,将配置文件里的nginx:1.16修改为nginx:latest
kubectl replace -f nginx-depolyment.yaml

Pod管理

节点绑定

Pod.spec.nodeName 强制约束pod调度到指定的node节点
Pod.spec.nodeSelector 通过lable-selector机制选择节点

重启机制

Always: 当容器停止,总是重建容器,默认策略
OnFailure: 当容器异常退出(退出状态码非0)时,才重启容器
Never: 当容器终止退出,从不重启容器

pod健康检查

probe机制,有两种类型
livenessProbe
如果检查失败,将杀死容器,根据pod的restartPolicy操作

readinessProbe
如果检查失败,Kubenetes会把pod从service endpoints中删除

Probe支持以下三种检查方法
httpGet
发送HTTP请求,返回200-400范围状态码为成功
exec
执行shell命令返回状态码为0为成功

例如: [ -e pidfile ] && echo 0 || echo 1

tcpSocket
发起TCP Socket建立成功

yaml配置文件示例

示例: busy.yaml

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
  labels:
    app: busybox
spec:
  containers:
  - name: busybox
    image: busybox
    ports:
    command:
      - ping
      - "www.baidu.com"
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
  restartPolicy: Always

示例: nginx.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  namespace: web
  # 标签
  labels:
    app: nginx
spec:
  # 节点绑定
  # nodeNmae: node01
  nodeSelector:
    env_role: dev
  containers:
  - name: nginx
    image: nginx
    ports:
    - protocol: TCP
      containerPort: 80
	# 资源限制
	resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
  restartPolicy: OnFailure   

问题定位

kubectl describe TYPE NAME_PREFIX
kubectl logs pod/xxx
kubectl exec -it pod/xxx /bin/bash

Service代理模式与负载均衡

  • 网络代理
  • 服务代理
  • 服务发现
  • 发布服务

yaml配置文件

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: web
  labels:
    web: nginx
spec:
  selector:
    app: nginx
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80
  - name: https
    protocol: TCP
    port: 443
    targetPort: 443

selector: 选择器,通过标签来匹配后端应用,做负载均衡

ports: 要暴露的后端端口,会分配一个clusterIP,并分配一个port

如果一个svc创建两个端口映射,需要-name来区分

  • apiVersion: 指定版本

  • kind: 类型

  • name: 指定服务名称

  • labels: 标签

  • port: Service 服务暴露的端口

  • targetPort: 容器暴露的端口

  • seletor: 关联的Pod的标签

如果需要在宿主机上暴露端口,需要加入type: NodePort,并指定nodePort:

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: web
  labels:
    web: nginx
spec:
  selector:
    app: nginx
  ports:
  - port: 88
    targetPort: 80
    # 这个一般不去指定,会生成一个随机端口,端口范围在apiserver配置文件中指定
    nodePort: 30008
  type: NodePort

通过kubectl get svc 查看,会发现TYPE类型变为NodePort,然后访问node的真实ip加nodePort端口即可访问pod服务

kubectl get svc -n web
NAME            TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
nginx-service   NodePort   10.0.0.150   <none>        88:30008/TCP   3m20

Service-服务发现

  • 环境变量

    当一个pod运行到Node,kubelet会为每个容器添加一组环境变量,Pod容器中程序就可以使用这些环境变量发现Service.

    环境变量格式如下:

    (SVCNAME)_SERVICE_HOST

    (SVCNAME)_SERVICE_PORT

    限制:

    1). Pod和Service的创建顺序是有要求的,Service必须在Pod创建之前被创建,否则环境变量不会被设置到Pod中

    2). Pod只能获取同Namespace中的Service环境变量

  • DNS

    DNS服务监视Kubernetes API,为每一个Service创建DNS记录用于域名解析,这样Pod中就可以通过DNS域名获取Service的访问地址

服务类型

  • ClusterIP

    分配一个内部集群IP地址,只能在集群内部访问(通Namespace内的pod),默认ServiceType.

  • NodePort

    分配一个内部集群IP地址,并在每个节点上启用一个端口来暴露服务,可以在集群外部访问

    访问地址: :

  • LoadBalancer

    分配一个内部集群IP地址,并在每个节点上启用一个端口来暴露服务.

    除此之外,Kubernets会请求底层云平台上的负载均衡,将每个Node([NodeIP]:[NodePort])作为后端添加进去

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值