彻底搞懂k8s网络

Kubernetes网络三部曲之一~Pod网络
【深入理解Kubernetes网络-哔哩哔哩】 https://b23.tv/QOJ3zMc
【Ingress Controller 的工作原理-哔哩哔哩】 https://b23.tv/RafCHrC
【什么是 Ingress 服务-哔哩哔哩】 https://b23.tv/uv1hOFU

错误记录


1 node(s) had taints that the pod didn’t tolerate
节点有了污点无法容忍,执行kubectl get no -o yaml | grep taint -A 5 之后发现该节点是不可调度的。这是因为kubernetes出于安全考虑默认情况下无法在master节点上部署pod【文章链接:https://blog.csdn.net/erhaiou2008/article/details/103907289】


nodePort拒绝访问的问题,pod网络不通的问题排查思路:https://blog.csdn.net/weixin_38380858/article/details/88830853


k8s命令收集

kubectl get namespace
kubectl create namespace test-env
//想看所有Pod都在哪些节点上运行
kubectl get pod -A -o yaml |grep '^    n'|grep -v nodeSelector|awk 'NR%3==1{print ++n"\n"$0;next}1' 1
//过滤掉系统的pod
kubectl get pod -A |grep -v kube-system
kubectl get pod -A

环境清理

kubectl delete svc --all
kubectl delete pod --all
kubectl delete cm --all
kubectl delete deployment --all

svc即service的缩写

kubectl delete svc demo1 demo2 demo3
kubectl delete deployment demo1 demo2 demo3 --grace-period=0 --force
kubectl create configmap demo-br --from-file=app/bootstrap.yaml 
kubectl get configmap --all-namespaces
kubectl describe configmap demo-ap
minikube start

//因为pod都删除了,对应的service就没有用了
//如果只删除pod,deployment会自动重建,所以应该先删除deployment

//所以创建关系是deployment---创建pods---生成service

ingress

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

ingress controller

在这里插入图片描述
nginx匹配域名是hash表,匹配路径是多叉树,把pod理解成主机,它有ip
service工作原理与手动配置endpoint资源
在这里插入图片描述
在这里插入图片描述

configMap使用方法

在这里插入图片描述
在这里插入图片描述

kubectl create configmap demo-br --from-file=app/bootstrap.yaml
kubectl get configmap --all-namespaces
kubectl describe configmap demo-ap

在这里插入图片描述
kubectl describe pod demo2-6886cf9fbf-x4jlb
在这里插入图片描述

helm命令大全

服务升级:helm upgrade nginx nginx

helm install的多种方式

补充:其实部署有多种方式:

指定chart: helm install stable/mariadb
指定打包的chart: helm install ./nginx-1.2.3.tgz
指定打包目录: helm install ./nginx
指定chart包URL: helm install https://example.com/charts/nginx-1.2.3.tgz
如果要覆盖chart中的默认值,通过指定配置文件方式 helm install -f myvalues.yaml ./redis

或通过–set key=value方式 helm install --set name=prod ./redis

例:helm install -n mysql -f mysql/values.yaml --set resources.requests.memory=512Mi mysql

k8s 资源清单-常用字段解释

helm里的yaml的介绍
chart–服务部署deployment.yaml,服务发现service.yaml和反向代理ingress.yaml
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

k8s解惑

k8s-集群里的三种IP(NodeIP、PodIP、ClusterIP)【https://blog.csdn.net/qq_21187515/article/details/101363521】
将服务暴露给外部的方式主要有三种[https://blog.csdn.net/Alexbyy/article/details/108569270]
Helm 3安装Nginx Ingress Controller和使用【https://blog.csdn.net/twingao/article/details/105157724】

Helm Chart 使用简析【https://blog.csdn.net/qq_39680564/article/details/107388151?utm_source=app&app_version=4.13.0&code=app_1562916241&uLinkId=usr1mkqgl919blen】

【K8S 命名空间 (namespace)】(https://blog.51cto.com/u_13760351/2622839)

【kubernetes资源对象与基本概念解析】(https://www.cnblogs.com/peteremperor/p/12184361.html)
chart 4种模版赋值
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

以部署为例

#test-pod 
apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中   
kind: Pod #指定创建资源的角色/类型   
metadata: #资源的元数据/属性   
  name: test-pod #资源的名字,在同一个namespace中必须唯一   
  labels: #设定资源的标签 
    k8s-app: apache   
    version: v1   
    kubernetes.io/cluster-service: "true"   
  annotations:            #自定义注解列表   
    - name: String        #自定义注解名字   
spec: #specification of the resource content 指定该资源的内容   
  restartPolicy: Always #表明该容器一直运行,默认k8s的策略,在此容器退出后,会立即创建一个相同的容器   
  nodeSelector:     #节点选择,先给主机打标签kubectl label nodes kube-node1 zone=node1   
    zone: node1   
  containers:   
  - name: test-pod #容器的名字   
    image: 10.192.21.18:5000/test/chat:latest #容器使用的镜像地址   
    imagePullPolicy: Never #三个选择Always、Never、IfNotPresent,每次启动时检查和更新(从registery)images的策略, 
                           # Always,每次都检查 
                           # Never,每次都不检查(不管本地是否有) 
                           # IfNotPresent,如果本地有就不检查,如果没有就拉取 
    command: ['sh'] #启动容器的运行命令,将覆盖容器中的Entrypoint,对应Dockefile中的ENTRYPOINT   
    args: ["$(str)"] #启动容器的命令参数,对应Dockerfile中CMD参数   
    env: #指定容器中的环境变量   
    - name: str #变量的名字   
      value: "/etc/run.sh" #变量的值   
    resources: #资源管理 
      requests: #容器运行时,最低资源需求,也就是说最少需要多少资源容器才能正常运行   
        cpu: 0.1 #CPU资源(核数),两种方式,浮点数或者是整数+m,0.1=100m,最少值为0.001核(1m) 
        memory: 32Mi #内存使用量   
      limits: #资源限制   
        cpu: 0.5   
        memory: 1000Mi   
    ports:   
    - containerPort: 80 #容器开发对外的端口 
      name: httpd  #名称 
      protocol: TCP   
    livenessProbe: #pod内容器健康检查的设置 
      httpGet: #通过httpget检查健康,返回200-399之间,则认为容器正常   
        path: / #URI地址   
        port: 80   
        #host: 127.0.0.1 #主机地址   
        scheme: HTTP   
      initialDelaySeconds: 180 #表明第一次检测在容器启动后多长时间后开始   
      timeoutSeconds: 5 #检测的超时时间   
      periodSeconds: 15  #检查间隔时间   
      #也可以用这种方法   
      #exec: 执行命令的方法进行监测,如果其退出码不为0,则认为容器正常   
      #  command:   
      #    - cat   
      #    - /tmp/health   
      #也可以用这种方法   
      #tcpSocket: //通过tcpSocket检查健康    
      #  port: number    
    lifecycle: #生命周期管理   
      postStart: #容器运行之前运行的任务   
        exec:   
          command:   
            - 'sh'   
            - 'yum upgrade -y'   
      preStop:#容器关闭之前运行的任务   
        exec:   
          command: ['service httpd stop']   
    volumeMounts:  #挂载持久存储卷 
    - name: volume #挂载设备的名字,与volumes[*].name 需要对应     
      mountPath: /data #挂载到容器的某个路径下   
      readOnly: True   
  volumes: #定义一组挂载设备   
  - name: volume #定义一个挂载设备的名字   
    #meptyDir: {}   
    hostPath:   
      path: /opt #挂载设备类型为hostPath,路径为宿主机下的/opt,这里设备类型支持很多种 
    #nfs

helm命令大全

https://blog.csdn.net/boganquan8199/article/details/100964828
在这里插入图片描述

密码

您必须使用sudo以下命令运行脚本:

sudo /path/to/script

但是在您必须允许jenkins在中运行脚本之前/etc/sudoers。

jenkins ALL = NOPASSWD: /path/to/script

Linux 下以其他用户身份运行程序—— su、sudo、runuser

su 对切换到超级权限用户 root 后,权限的无限制性,所以 su 并不能担任多个管理员所管理的系统。如果用 su 来切换到超级用户来管理系统,也不能明确哪些工作是由哪个管理员进行的操作。特别是对于服务器的管理有多人参与管理时,最好是针对每个管理员的技术特长和管理范围,并且有针对性的下放给权限–sudo登陆
在这里插入图片描述
sudo 执行命令的流程是当前用户切换到root(或其它指定切换到的用户),然后以root(或其它指定的切换到的用户)身份执行命令,执行完成后,直接退回到当前用户,而这些的前提是要通过sudo的配置文件/etc/sudoers来进行授权。默认只有 root 用户能使用 sudo 命令,普通用户想要使用 sudo,是需要 root 预先设定的,默认 root 能够 sudo 是因为这个文件中有一行”root ALL=(ALL) ALL”。

cat /etc/shadow

jenkins

cat /etc/passwd
cat /etc/shadow
authconfig --test | grep hashing

jenkins:解决root无法su到jenkins用户(jenkins运行权限问题)—https://blog.csdn.net/weixin_43819222/article/details/91038426

新建了一个用户,没有设置密码的话,密码就是未知数。
这个用户没法直接登录,使用root用户su 的除外。
一般的话:useradd 和passwd是一对一对的出现,建一个用户就得设置这个用户的密码。
l

inux 如何禁用账号和解除禁用账号
把账号禁用可以有几个方法:

  1. usermod -L

    usermod -U // 解除禁用

  2. 修改/etc/passwd文件,可以有几个地方
    1)把第二个字段中的"x"变成其它的字符,该账号就不能登录
    2)把/bin/bash修改成/sbin/nologin
  3. 修改/etc/shadow文件
    1)在第二个密码字段的前面加上一个“!”,该账号就不能登录,这个其实就是usermod -L命令的结果
    2)在最后两个冒号之间加上数字"1",表示该账号的密码自1970年1月1日起,过一天后立即过期,当然现在自然就不能登录了。
    如果想解禁,把修改的东西去掉就可以了。
    密码域密文也是由三

部分组成的,即:$ id$ salt$ encrypted。 DES和明文开头无标记 id为1时,采用md5进行加密; id为5时,采用SHA256进行加密; id为6时,采用SHA512进行加密

[将jenkins配置成root身份登陆系统-修改用户为root (避免权限导致的问题)](jenkins 配置root用户)

jenkins:解决root无法su到jenkins用户

把账号禁用可以有几个方法:
usermod -L
usermod -U // 解除禁用
2. 修改/etc/passwd文件,可以有几个地方
1)把第二个字段中的"x"变成其它的字符,该账号就不能登录
2)把/bin/bash修改成/sbin/nologin
3. 修改/etc/shadow文件
1)在第二个密码字段的前面加上一个“!”,该账号就不能登录,这个其实就是usermod -L命令的结果
2)在最后两个冒号之间加上数字"1",表示该账号的密码自1970年1月1日起,过一天后立即过期,当然现在自然就不能登录了。
如果想解禁,把修改的东西去掉就可以了。

笔记

vim 的全局替换
:%s/web-demo/{{name}}/g

project_name
image_name

在这里插入图片描述

在这里插入图片描述

cat .kube/config

拿到配置文件
vi .kube/config

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

自动部署

jenkins系列教程
jenkins流水线脚本详解

agent 说明流水线哪一个节点运行,声明式不能写变量和if-else判断语句,这个问题可以结合script来弥补

部署完成后需要做些善后事情,比如发邮件,成功失败的归档,
在这里插入图片描述

在这里插入图片描述

pipeline {
    agent any
    environment {
        cc = 'clang'
    }
    stages {
        stage('build') {
            steps{
                echo "variable is ${cc}"
                // exit 1  这是回报异常,说没有exit,这时post.failure就会被调用
                // git 'https://gitee.com/goodshred/k8s-hello-world.git'
                // sh "mvn -Dmaven.test.failure.ignore=true clean package"
                script {
                    def browsers = ['chrome', 'firefox']
                    for (int i = 0; i < browsers.size(); ++i) {
                        echo "Testing the ${browsers[i]} browser"
                    }
                }
            }
        }
    }
    post {
        success {
            script {
                echo "post==success"
            }
        }
        failure  {
            script {
                echo "post==failure"
            }
        }
        //构建不稳定时
        //随着项目的开发和持续扩展,使用Jenkins构建(build)项目越来越多,Jenkins服务器的磁盘可能被大日志文件占满造成无法继续构建项目的异常(一般会出现构建按钮为黄色)
        unstable  {
            script {
                echo "post==unstable "
            }
        }

    }
}

jenkins使用

chmod +x 给脚本提前加权限
docker build xxx .
docker login xxx.com
JOB_NAME是Jenkins自带的全局变量

WORKSPACE是jenkins的工作空间,module是模块名
898948adf57447a0b5f2845ac0c5d090
即创建一个ci,cd
在这里插入图片描述
点击可查看更多流水线语法:http://192.168.177.201:18080/job/k8s-web-demo/pipeline-syntax/
在这里插入图片描述


在这里插入图片描述

jenkins自动化部署

centOS7下使用yum安装jenkins以及运行jenkins

jenkins中文文档

sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
yum install jenkins

rpm -ql jenkins 查看安装信息
vi /etc/sysconfig/jenkins 可修改jenkins配置(端口号…我该成了18080)【JENKINS_USER=“root” 它默认会在linux上创建jenkins,但该用户权限贼低,改成root则会受很少限制–改完重启服务】
启动 | 停止 | 重启 | 查看状态 jenkins:
systemctl start | stop | restart | status jenkins
安装相关的字体包和相关字体管理包,还有一些openJDK不带有的相关库
sudo yum install dejavu-sans-fonts
sudo yum install fontconfig
sudo yum install xorg-x11-server-Xvfb

然后使用service start jenkins或者systemctl start jenkins启动,这时用lsof -i:18080是查不到服务的,需要先在浏览器访问18080,这是Jenkins才会启动一系列服务,该过程需要等待1-2分钟,这时在lsof -i:18080是可以看到内容的。

新建了一个用户,没有设置密码的话,密码就是未知数。
这个用户没法直接登录,使用root用户su 的除外。
一般的话:useradd 和passwd是一对一对的出现,建一个用户就得设置这个用户的密码。

CI CD

docker-maven-plugin插件打包Docker镜像

一个自动部署就是一个jobs,

在这里插入图片描述

持续集成,持续发布的意思

改了dns或者主机域名,这就导致环境不可控
在这里插入图片描述

k8s单机版一键安装

Kubernetes单机部署-一键安装
docker卸载(如果原机器有的话)

yum list installed|grep docker
yum -y remove docker-ce.x86_64
yum -y remove docker-ce-cli.x86_64
yum -y remove containerd.io.x86_64
rm -rf /var/lib/docker/
docker --version

创建install-k8s.sh安装脚本

#!/bin/sh

# ----------------------------------------
# k8s单机版一键安装脚本
# author wangll
# date 2019-08-11
# 执行本脚本时如果报错:找不到解释器,执行:sed -i 's/\r$//' install-k8s.sh
# 参考:https://www.missshi.cn/api/view/blog/5b0e8af013d85b22bc000001
# ----------------------------------------

# 1 关闭防火墙

systemctl disable firewalld
systemctl stop firewalld

# 2 禁用SELINUX
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

# 3 升级yum,一般不需要,这步很耗时,非必要
# yum -y update

# 4 安装etcd和Kubernetes(自动附带安装Docker)
yum install -y etcd kubernetes

# 5 修改/etc/sysconfig/docker文件。修改OPTIONS的内容为:
sed -i "s/--selinux-enabled --log-driver=journald --signature-verification=false/--selinux-enabled=false --insecure-registry gcr.io/g" /etc/sysconfig/docker

# 6 修改/etc/kubernetes/apiserver文件。修改KUBE_ADMISSION_CONTROL的内容为:
sed -i "s/--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota/--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota/g" /etc/kubernetes/apiserver

# 7 依次启动下列服务:
systemctl start etcd
systemctl start docker
systemctl start kube-apiserver
systemctl start kube-controller-manager
systemctl start kube-scheduler
systemctl start kubelet
systemctl start kube-proxy

# 8 解决创建的pod一直是ContainerCreating状态,ready数一直为0的问题。参考:https://blog.csdn.net/qq_38695182/article/details/82971114
yum install -y *rhsm*
yum install -y wget
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem
rm -rf python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest


# 9 设置允许转发,否则会造成“服务都已经启动好了,但是外界无法访问”。参考https://blog.csdn.net/weixin_38698322/article/details/91155594
iptables -P FORWARD ACCEPT

检验是否安装成功
kubectl get rc,services
在这里插入图片描述

注意:
电脑重启后,k8s的服务也会关闭,执行kubectl命令会报链接8080失败,这时候需要启动kubectl服务

systemctl start etcd
systemctl start docker
systemctl start kube-apiserver
systemctl start kube-controller-manager
systemctl start kube-scheduler
systemctl start kubelet
systemctl start kube-proxy

有时候还可能是如下原因造成
The connection to the server localhost:8080 was refused - did you specify the right host or port?解决
我的文件是/etc/kubernetes/config

部署springboot项目到k8s中

vi dockertest.yaml

apiVersion: v1
kind: Service
metadata:
  name: dockertest
  namespace: default
  labels:
    app: dockertest
spec:
  type: NodePort
  ports:
  - port: 30009
    targetPort: 9999  
   # type: NodePort # 在主机上暴露端口
    nodePort: 9999 #service对外开放端口
  selector:
    app: dockertest
---
apiVersion: extensions/v1beta1
#apps/v1,extensions/v1beta1需要根据自己k8s的版本选择
kind: Deployment #对象类型
metadata:
  name: dockertest #名称
  labels:
    app: dockertest #标注 
spec:
  replicas: 1 #运行容器的副本数,修改这里可以快速修改分布式节点数量
  selector:
    matchLabels:
      app: dockertest
  template:
    metadata:
      labels:
        app: dockertest
    spec:
      containers: #docker容器的配置
      - name: dockertest
        image: goodshred/hello-world:latest # 192.168.1.253:8081/pasq/dockertest:0.0.1 # pull镜像的地址 ip:prot/dir/images:tag
        imagePullPolicy: IfNotPresent #pull镜像时机,
        ports:
        - containerPort: 9999 #容器对外开放端口

将默认的对外暴露端口的范围30000-32767修改成1-6万,

vi /etc/kubernetes/apiserver

追加配置:–service-node-port-range=1-65535
在这里插入图片描述

systemctl restart kube-apiserver
kubectl apply -f dockertest.yaml     # 创建/更新
lsof -i:9999

docker build xxx .以及dockerignore 文件
指定docker镜像中的根路径,比如./resource,-t参数即说明tag版本号,-f :指定要使用的Dockerfile路径;
docker build 最后的 . 号,其实是在指定镜像构建过程中的上下文环境的目录。理解了上面的这些概念,就更方便的去理解 .dockerignore 文件的作用了。比如说 dockerfile 中的 COPY ./package.json /project,其实拷贝的并不是本机目录下的 package.json 文件,而是 docker引擎 中展开的构建上下文中的文件,所以如果拷贝的文件超出了构建上下文的范围,Docker引擎 是找不到那些文件的。

k8s中文手册以及学习视频

k8s中文手册
Kubernetes/k8s生产级从部署到核心应用

部署链接https://gitee.com/pa/kubernetes-ha-kubeadm-private/blob/kubernetes-1.14/docs/1-prepare.md

架构设计

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
ETCD:作为数据持久化,防止k8s上数据重启丢失
schduling调度器:根据cpu,内存等指标选择最优节点进行节点pod的创建
controllerMannager(serviceController,podController,sourceController(管理资源内容的))
kubelet负责维护pod的生命周期(网络)
在这里插入图片描述
K8s(Kubernetes)架构学习笔记(https://blog.csdn.net/gongxsh00/article/details/79932136?utm_source=app&app_version=4.13.0&code=app_1562916241&uLinkId=usr1mkqgl919blen)
在这里插入图片描述
在这里插入图片描述
有一堆客人来了(镜像容器/资源清单/yaml文件),他先要到酒店的前台/接待大厅(api-server)去进行登记信息登记(etcd),完事执行部署(deployment),控制器(controller)说,我要分配几个房间(replisetController,客户的大件物品我要存在哪里(PersistVolumeController),要跟踪客人的状态(预订,住房,退房) 调度器(scheduler)决定说把你分配到哪个房间,大老板就是vip房间。一般人就是普通房间

(专业人员的命令都来自于api-server下发的)每个房间都会有专门人员负责服务(service),刷卡(kubelet)就可以启动房间内设备运转,像灯,电视等

节点ip,集群ip,额外ip
一个pod有一个pause容器,它有一个ip,叫(pod ip有真实node宿主机的网卡提供支持),pod里面的其它容器共享该ip,他们彼此间直接通过端口通信,有cluster ip集群ip,它是由iptable防火墙虚拟出来的,逻辑上的,extra ip这是给service提供外部访问的ip,方式有2种:通过设置nodePort映射到物理机,同时设置Service的类型为NodePort。通过设置LoadBalancer映射到云服务上提供的LoadBalancer地址

k8s命令大全

https://blog.csdn.net/liumiaocn/article/details/73913597可做参考

kubectl delete pods 节点名—》改操作可以直接删除Evicted 挂掉的节点,但是处于running的节点由于
replicas副本机制,会再马上启动副本,因此并不能完全删除
可以执行如下操作进行强删
kubectl get deployment 获取到节点名
kubectl delete deployment 节点名 --grace-period=0 --force 【grace-period优雅停止,–force 强行删除,避免确保机制,保证完全删除】

删除节点(等同于强删服务节点)

kubectl delete deployment unified-file-service -n gasc-test
kubectl get deployments -n gasc-test 查看服务发布状态

get pod -o wide 详情

# 查看命名空间,查看所有资源
kubectl get namespaces
kubectl get all -n tgac 等价于 kubectl get all --namespace=tgac
# 查看所有namespace的pods运行情况
kubectl get pods --all-namespaces 
# 查看具体pods,记得后边跟namespace名字哦
kubectl get pods  kubernetes-dashboard-76479d66bb-nj8wr --namespace=kube-system
# 查看pods具体信息
kubectl get pods -o wide kubernetes-dashboard-76479d66bb-nj8wr --namespace=kube-system
# 查看集群健康状态
kubectl get cs
# 获取所有deployment
kubectl get deployment --all-namespaces
# 查看kube-system namespace下面的pod/svc/deployment 等等(-o wide 选项可以查看存在哪个对应的节点)
kubectl get pod /svc/deployment -n kube-system
# 列出该 namespace 中的所有 pod 包括未初始化的
kubectl get pods --include-uninitialized
# 查看deployment()
kubectl get deployment nginx-app
# 查看rc和servers
kubectl get rc,services
# 查看pods结构信息(重点,通过这个看日志分析错误)
# 对控制器和服务,node同样有效
kubectl describe pods xxxxpodsname --namespace=xxxnamespace
# 其他控制器类似吧,就是kubectl get 控制器 控制器具体名称
# 查看pod日志
kubectl logs $POD_NAME
# 查看pod变量
kubectl exec my-nginx-5j8ok -- printenv | grep SERVICE
# 集群
kubectl get cs           # 集群健康情况
kubectl cluster-info     # 集群核心组件运行情况
kubectl get namespaces    # 表空间名
kubectl version           # 版本
kubectl api-versions      # API
kubectl get events       # 查看事件
kubectl get nodes      //获取全部节点
kubectl delete node k8s2  //删除节点
kubectl rollout status deploy nginx-test
kubectl get deployment --all-namespaces
kubectl get svc --all-namespaces

# 创建
kubectl create -f ./nginx.yaml           # 创建资源
kubectl apply -f xxx.yaml (创建+更新,可以重复使用)
kubectl create -f .                            # 创建当前目录下的所有yaml资源
kubectl create -f ./nginx1.yaml -f ./mysql2.yaml     # 使用多个文件创建资源
kubectl create -f ./dir                        # 使用目录下的所有清单文件来创建资源
kubectl create -f https://git.io/vPieo         # 使用 url 来创建资源
kubectl run -i --tty busybox --image=busybox    ----创建带有终端的pod
kubectl run nginx --image=nginx                # 启动一个 nginx 实例
kubectl run mybusybox --image=busybox --replicas=5    ----启动多个pod
kubectl explain pods,svc                       # 获取 pod 和 svc 的文档

# 更新
kubectl rolling-update python-v1 -f python-v2.json           # 滚动更新 pod frontend-v1
kubectl rolling-update python-v1 python-v2 --image=image:v2  # 更新资源名称并更新镜像
kubectl rolling-update python --image=image:v2                 # 更新 frontend pod 中的镜像
kubectl rolling-update python-v1 python-v2 --rollback        # 退出已存在的进行中的滚动更新
cat pod.json | kubectl replace -f -                              # 基于 stdin 输入的 JSON 替换 pod
# 为 nginx RC 创建服务,启用本地 80 端口连接到容器上的 8000 端口
kubectl expose rc nginx --port=80 --target-port=8000

# 更新单容器 pod 的镜像版本(tag)到 v4
kubectl get pod nginx-pod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | kubectl replace -f -
kubectl label pods nginx-pod new-label=awesome                      # 添加标签
kubectl annotate pods nginx-pod icon-url=http://goo.gl/XXBTWq       # 添加注解
kubectl autoscale deployment foo --min=2 --max=10                # 自动扩展 deployment “foo”

# 编辑资源
kubectl edit svc/docker-registry                      # 编辑名为 docker-registry 的 service
KUBE_EDITOR="nano" kubectl edit svc/docker-registry   # 使用其它编辑器
vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf #修改启动参数

# 动态伸缩pod
kubectl scale --replicas=3 rs/foo                                 # 将foo副本集变成3个
kubectl scale --replicas=3 -f foo.yaml                            # 缩放“foo”中指定的资源。
kubectl scale --current-replicas=2 --replicas=3 deployment/mysql  # 将deployment/mysql从2个变成3个
kubectl scale --replicas=5 rc/foo rc/bar rc/baz                   # 变更多个控制器的数量
kubectl rollout status deploy deployment/mysql                         # 查看变更进度

#label 操作
kubectl label:添加label值 kubectl label nodes node1 zone=north #增加节点lable值 spec.nodeSelector: zone: north #指定pod在哪个节点
kubectl label pod redis-master-1033017107-q47hh role=master #增加lable值 [key]=[value]
kubectl label pod redis-master-1033017107-q47hh role- #删除lable值
kubectl label pod redis-master-1033017107-q47hh role=backend --overwrite #修改lable值

# 滚动升级
kubectl rolling-update:滚动升级 kubectl rolling-update redis-master -f redis-master-controller-v2.yaml #配置文件滚动升级
kubectl rolling-update redis-master --image=redis-master:2.0 #命令升级
kubectl rolling-update redis-master --image=redis-master:1.0 --rollback #pod版本回滚

# etcdctl 常用操作
etcdctl cluster-health #检查网络集群健康状态
etcdctl --endpoints=https://192.168.71.221:2379 cluster-health #带有安全认证检查网络集群健康状态
etcdctl member list
etcdctl set /k8s/network/config ‘{ “Network”: “10.1.0.0/16” }’
etcdctl get /k8s/network/config

# 删除
kubectl delete pod -l app=flannel -n kube-system   # 根据label删除:
kubectl delete -f ./pod.json                                              # 删除 pod.json 文件中定义的类型和名称的 pod
kubectl delete pod,service baz foo                                        # 删除名为“baz”的 pod 和名为“foo”的 service
kubectl delete pods,services -l name=myLabel                              # 删除具有 name=myLabel 标签的 pod 和 serivce
kubectl delete pods,services -l name=myLabel --include-uninitialized      # 删除具有 name=myLabel 标签的 pod 和 service,包括尚未初始化的
kubectl -n my-ns delete po,svc --all      # 删除 my-ns namespace下的所有 pod 和 serivce,包括尚未初始化的
kubectl delete pods prometheus-7fcfcb9f89-qkkf7 --grace-period=0 --force 强制删除
kubectl delete deployment kubernetes-dashboard --namespace=kube-system
kubectl delete svc kubernetes-dashboard --namespace=kube-system
kubectl delete -f kubernetes-dashboard.yaml
kubectl replace --force -f ./pod.json # 强制替换,删除后重新创建资源。会导致服务中断。

# 交互
kubectl logs nginx-pod                                 # dump 输出 pod 的日志(stdout)
kubectl logs nginx-pod -c my-container                 # dump 输出 pod 中容器的日志(stdout,pod 中有多个容器的情况下使用)
kubectl logs -f nginx-pod                              # 流式输出 pod 的日志(stdout)
kubectl logs -f nginx-pod -c my-container              # 流式输出 pod 中容器的日志(stdout,pod 中有多个容器的情况下使用)
kubectl run -i --tty busybox --image=busybox -- sh  # 交互式 shell 的方式运行 pod
kubectl attach nginx-pod -i                            # 连接到运行中的容器
kubectl port-forward nginx-pod 5000:6000               # 转发 pod 中的 6000 端口到本地的 5000 端口
kubectl exec nginx-pod -- ls /                         # 在已存在的容器中执行命令(只有一个容器的情况下)
kubectl exec nginx-pod -c my-container -- ls /         # 在已存在的容器中执行命令(pod 中有多个容器的情况下)
kubectl top pod POD_NAME --containers               # 显示指定 pod和容器的指标度量
kubectl exec -ti podName /bin/bash     # 进入pod

# 调度配置
kubectl cordon k8s-node                                                # 标记 my-node 不可调度
kubectl drain k8s-node                                                 # 清空 my-node 以待维护
kubectl uncordon k8s-node                                              # 标记 my-node 可调度
kubectl top node k8s-node                                              # 显示 my-node 的指标度量
kubectl cluster-info dump                                             # 将当前集群状态输出到 stdout                                    
kubectl cluster-info dump --output-directory=/path/to/cluster-state   # 将当前集群状态输出到 /path/to/cluster-state
#如果该键和影响的污点(taint)已存在,则使用指定的值替换
kubectl taint nodes foo dedicated=special-user:NoSchedule
#查看kubelet进程启动参数
ps -ef | grep kubelet
# 查看日志:
journalctl -u kubelet -f

导出配置文件:
  导出proxy
  kubectl get ds -n kube-system -l k8s-app=kube-proxy -o yaml>kube-proxy-ds.yaml
  导出kube-dns
  kubectl get deployment -n kube-system -l k8s-app=kube-dns -o yaml >kube-dns-dp.yaml
  kubectl get services -n kube-system -l k8s-app=kube-dns -o yaml >kube-dns-services.yaml
  导出所有 configmap
  kubectl get configmap -n kube-system -o wide -o yaml > configmap.yaml

复杂操作命令:
 删除kube-system 下Evicted状态的所有pod:
kubectl get pods -n kube-system |grep Evicted| awk{print $1}|xargs kubectl delete pod -n kube-system
以下为维护环境相关命令:
重启kubelet服务
systemctl daemon-reload
systemctl restart kubelet

k8s是一个集群,他将每个微服务应用打包成一个docker镜像,然后丢到k8s容器里面,每个镜像就是一个节点了,至于会丢到哪台机器,k8s会根据集群中机器资源的使用状况来定。至于部署好之后,我只需要知道一台机器的ip+登录信息,就可以获取到整个集群的所有节点的信息了斜体样式


mysql -h 10.4.0.44 -u root -psawXG841rx


kubectl logs gasc-community-access-68589d76-wk6pj  -n gasc-test |tail -n 1

kubectl  get pod -n gasc-dev
kubectl  logs gasc-base-government-7c87c4ff88-qdw2d  -n gasc-dev|grep "/file/add" -A20 -B20
kubectl describe pod -n gasc-dev unified-file-service-855cb9cc8b-j2xvm

cat ibpms_engine_api.log|grep 20:41:15 -A40 -B70
cd gasc-base-government/
cat gasc-base-government.log | tail -n 500
cat gasc-base-government.log | grep "/file/add" -A20 -B20



history查询历史命令
kubectl apply -f ingress.yaml 
vim ingress.yaml
history | grep mysql
history | grep mysql
curl -I htps://ctrain-live.tgovcloud.com
curl -I htps://ctrain-live.tgovcloud.com
kubectl get svn -n gasc-dev 

直接运行curl实现错误再现
curl --location --request POST 'http://ipcgasc.pdcts.com.cn/api/reservation/config/get' --header 'A
uthorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJhY2NvdW50IjoiMTExMTExMTEiLCJ0cyI6MTU5NTc3MzQ1NTkxOCwiYWNjb3VudFR5cGUiOjF9.KfKpydI
6-vakDm78CPR8wnHnJAC1Jo_QipICe07y2P0' --header 'x-gasc-utype: {{x-gasc-utype}}' --header 'x-gasc-uid: eason' --header 'Content
-Type: application/json' --data-raw '{
     "hallId": 732282014736056320,
     "itemId": 729758094745141249
 }'
//grep参数详解
//-A 20 除了显示符合范本样式的那一行之外,并显示该行之后的20行的内容。
//-A 20 除了显示符合范本样式的那一行之外,并显示该行之前的20行的内容。
 kubectl logs  xxx -n gasc-dev|grep "doc/import" -A 20 -B 20
 
kubectl exec -it gasc-base-government-686d9fcd44-j869z /bin/bash -n gasc-dev
kubectl exec -it /bin/bash gasc-base-government-686d9fcd44-j869z -n gasc-dev

kubectl  get pod -n gasc-dev -o wide
history|grep kube
kubectl  delete  deployment engine-api -n gasc-test

kubectl  logs engine-api-678fbcb7df-zrwcl -n gasc-test

 kubectl  get pod -n gasc-test -o wide

查看发布状态
kubectl  get pod -n gasc-dev


kubectl  get pod -n gasc-dev -o wide

查看容器日志
kubectl logs -f gasc-base-government-686d9fcd44-j869z  -n gasc-dev

查看k8s里面所有的pod【豌豆荚】
kubectl get pod -A  

一个k8s容器里面有很多pod,一个pod里面有很多容器。

列出所有包含gasc-dev容器的pod【查看发布状态】
kubectl  get pod -n gasc-dev


密码:




https://www.cnblogs.com/klvchen/archive/2018/09/04/9585746.html   
还可以


参数详解
https://www.jianshu.com/p/b809f2aa3c0e


一,kubectl 命令行的语法如下:
$ kubectl [command]  [TYPE]  [NAME] [flags]
上面的命令是: kubectl命令行中,指定执行什么操作(command),指定什么类型资源对象(type),指定此类型的资源对象名称(name),指定可选参数(flags),后面的参数就是为了修饰那个唯一的对象
属于典型的英文语法,比如你是老师,你说,小明(kubectl)买(command)方便面(type)老坛酸菜方便面(name)桶装的(flag)。命令的根本原则是准确性,不能有异议!
https://www.cnblogs.com/chaojiyingxiong/p/11331545.html

查询所有pod并递归输出每个pod里面的容器镜像名称
kubectl get pods --all-namespaces -o jsonpath="{..image}" |\
tr -s '[[:space:]]' '\n' |\
sort |\
uniq -c


自己撰写helm的chart(镜像)

【自己撰写helm的chart(镜像)】https://blog.csdn.net/rookie23rook/article/details/114843084

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐