kubernetes的安装和使用

1 kubernetes介绍

1.1 kubernetes功能

自动装箱

  • 基于容器对应用运行环境的资源配置要求自动部署应用容器

自我修复(自愈能力)

  • 当容器失败时,会对容器进行重启
  • 当所部署的Node节点有问题时,会对容器进行重新部署和重新调度
  • 当容器未通过监控检查时,会关闭此容器
  • 直到容器正常运行时,才会对外提供服务

水平扩展

  • 通过简单的命令、用户UI界面或基于CPU等资源使用情况,对应用容器进行规模扩大或规模剪裁

服务发现

  • 用户不需要使用额外的服务发现机制,就能够基于Kubernetes自身能力实现服务发现和负载均衡

滚动更新

  • 可以根据应用的变化,对应用容器运行的应用,进行一
    次性或批量式更新

版本回退

  • 可以根据应用部署情况,对应用容器运行的应用,进行历史版本即时回退

密钥和配置管理

  • 在不需要重新构建镜像的情况下,可以部署和更新密钥和应用配置,类似热部署。

存储编排

  • 自动实现存储系统挂载及应用,特别对有状态应用实现数据持久化非常重要
  • 存储系统可以来自于本地目录、网络存储(NFS、Gluster、Ceph、Cinder等)、公共云存储服务等

1.2 kubernetes架构

应用部署分类

无中心节点架构

  • GlusterFS

有中心节点架构

  • HDFS
  • K8S

节点角色功能

Master Node

  • k8s集群控制节点,对集群进行调度管理,接受集群外用户去集群操作请求;
  • Master Node由API Server、Scheduler、Cluster State Store(ETCD数据库)和Controller MangerServer所组成;

Worker Node

  • 集群工作节点,运行用户业务应用容器;
  • Worker Node包含kubelet、kube proxy和ContainerRuntime;

1.3 kubernetes组件

1.3.1 NameSpace

  • 命名空间
  • 作用:多租户情况下,实现资源隔离
  • 属于逻辑隔离
  • 属于管理边界
  • 不属于网络边界
  • 可以针对每个namespace做资源配额

1.3.2 pod

  • Pod是kubernetes集群能够调度的最小单元
  • Pod是容器的封装

1.3.3 controller

  • 控制器
  • 用于对应用运行的资源对象进行监控
  • 当Pod出现问题时,会把Pod重新拉起,以达到用户的期望状态

常见的controller控制器

控制器名称 作用
Deployment 声明式更新控制器,用于发布无状态应用
ReplicaSet 副本集控制器,用于对Pod进行副本规模 扩大或剪裁
StatefulSet 有状态副本集,用于发布有状态应用
DaemonSet 在k8s集群每一个Node上运行一个副本, 用于发布监控或日志收集类等应用
Job 运行一次性作业任务
CronJob 运行周期性作业任务

Deployment控制器介绍

  • 具有上线部署、滚动升级、创建副本、回滚到以前某一版本(成功/ 稳定)等功能
  • Deployment包含ReplicaSet,除非需要自定义升级功能或者根本不需要升级Pod,否则还是建议使用
    Deployment而不直接使用Replica Set 。

1.3.4 Service

Service介绍

  • 不是实体服务
  • 是一条iptables或ipvs的转发规则

Service作用

  • 通过Service为pod客户端提供访问pod方法,即客户端访问pod入口
  • Service通过Pod标签与Pod进行关联

Service类型

  • ClusterIP:默认,分配一个集群内部可以访问的虚拟IP
  • NodePort:在每个Node上分配一个端口作为外部访问入口
  • LoadBalancer:工作在特定的Cloud Provider上,例如Google Cloud,AWS,OpenStack
  • ExternalName:表示把集群外部的服务引入到集群内部中来,即实现了集群内部pod和集群外部的服务进行通信

Service参数

  • port 访问service使用的端口
  • targetPort Pod中容器端口
  • NodePort 通过Node实现外网用户访问k8s集群内service(30000-32767)

Service创建

  • Service的创建在工作中有两种方式,一是命令行创建,二是通过资源清单文件YAML文件创建

2 kubernetes安装

2.1 系统说明

主机名称 IP地址 安装的软件
k8s-master 192.168.0.1 kube-apiserver、kube-controller-manager、kube-scheduler、docker、etcd、calico
k8s-node1 192.168.0.2 kubelet、kubeproxy、docker
k8s-node2 192.168.0.3 kubelet、kubeproxy、docker

2.2 集群安装

2.2.1 三台机器都需要操作的步骤

1.修改hostname及hosts文件

#自改hostname
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1 
hostnamectl set-hostname k8s-node2

#修改hosts文件
vim /etc/hosts
#追加内容
192.168.66.101 k8s-master 
192.168.66.102 k8s-node1
192.168.66.103 k8s-node2

**2.**安装依赖包

yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wgetvimnet-tools git

3.设置防火墙为 Iptables 并设置空规则

#关闭防火墙
systemctl  stop firewalld  &&  systemctl  disable firewalld

#设置空规则
yum -y install iptables-services  &&  systemctl  start iptables  &&  systemctl  enable iptables&&  iptables -F  &&  service iptables save

4.关闭防火墙和关闭SELinux

#临时关闭SELinux
setenforce 0 

#永久关闭SELinux
vi /etc/sysconfig/selinux 
#修改内容
SELINUX=disabled

5.设置系统参数

设置允许路由转发,不对bridge的数据进行处理

#创建文件
vi /etc/sysctl.d/k8s.conf
#内容
net.bridge.bridge-nf-call-ip6tables = 1 
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1 
net.ipv4.tcp_tw_recycle = 0
vm.swappiness = 0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
vm.overcommit_memory = 1 # 不检查物理内存是否够用
vm.panic_on_oom = 0 # 开启 OOM
fs.inotify.max_user_instances = 8192
fs.inotify.max_user_watches = 1048576
fs.file-max = 52706963
fs.nr_open = 52706963
net.ipv6.conf.all.disable_ipv6 = 1
net.netfilter.nf_conntrack_max = 2310720

执行文件

sysctl -p /etc/sysctl.d/k8s.conf

6.调整系统时区

# 设置系统时区为中国/上海
timedatectl set-timezone Asia/Shanghai

# 将当前的 UTC 时间写入硬件时钟
timedatectl set-local-rtc 0

# 重启依赖于系统时间的服务
systemctl restart rsyslog
systemctl restart crond

7.关闭不需要服务

systemctl stop postfix && systemctl disable postfix

8.kube-proxy开启ipvs的前置条件

vim /etc/sysconfig/modules/ipvs.modules
#内容
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4

#执行命令
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

9.所有节点关闭swap

#临时关闭
swapoff -a 

#永久关闭
vi /etc/fstab 
#注释掉以下字段
/dev/mapper/cl-swap swap swap defaults 0 0

10.设置 rsyslogd 和 systemd journald

mkdir /var/log/journal 
# 持久化保存日志的目录
mkdir /etc/systemd/journald.conf.d

#编辑文件
vim /etc/systemd/journald.conf.d/99-prophet.conf
#内容
[Journal]
# 持久化保存到磁盘
Storage=persistent
# 压缩历史日志
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
# 最大占用空间 10G
SystemMaxUse=10G
# 单日志文件最大 200M
SystemMaxFileSize=200M
# 日志保存时间 2 周
MaxRetentionSec=2week
# 不将日志转发到 syslog
ForwardToSyslog=no

#重启
systemctl restart systemd-journald

11.升级系统内核为4.44

rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
# 安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry 中是否包含 initrd16 配置,如果没有,再安装一次!
yum --enablerepo=elrepo-kernel install -y kernel-lt

# 设置开机从新内核启动
grub2-set-default 'CentOS Linux (4.4.189-1.el7.elrepo.x86_64) 7 (Core)'

12.安装kubelet、kubeadm、kubectl

  • kubeadm: 用来初始化集群的指令
  • kubelet: 在集群中的每个节点上用来启动 pod 和 container 等
  • kubectl: 用来与集群通信的命令行工具

清空yum缓存

yum clean all

设置yum安装源

vim /etc/yum.repos.d/kubernetes.repo
内容
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

安装:

yum install -y kubelet-1.17.2 kubeadm-1.17.2 kubectl-1.17.2

提示公钥未安装解决方法:在yum install xxxx 命令之后添加 --nogpgcheck 进行跳过公钥检查安装

kubelet设置开机启动(注意:先不启动,现在启动的话会报错)

systemctl enable kubelet

查看版本

kubelet --version

2.2.2 Master节点需要完成

1.运行初始化命令

kubeadm init --kubernetes-version=1.17.2 --apiserver-advertise-address=192.168.0.1 --image-repository registry.aliyuncs.com/google_containers --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16

注意:apiserver-advertise-address这个地址必须是master机器的IP

常用错误:
错误一:[WARNING IsDockerSystemdCheck]: detected “cgroupfs” as the Docker cgroup driver
作为Docker cgroup驱动程序。,Kubernetes推荐的Docker驱动程序是“systemd”
解决方案:修改Docker的配置: vi /etc/docker/daemon.json,加入

{
"exec-opts":["native.cgroupdriver=systemd"]
}

然后重启Docker

提示节点安装的命令,必须记下来

kubeadm join 192.168.0.1:6443 --token 754xxxx.xxxxxxxxxxxxxxxx \
--discovery-token-ca-cert-hash
sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

2.启动kubelet

systemctl restart kubelet

3.配置kubectl工具

mkdir -p $HOME/.kube
 cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
 chown $(id -u):$(id -g) $HOME/.kube/config

4.安装Calico

mkdir k8s
cd k8s
wget https://docs.projectcalico.org/v3.10/gettingstarted/kubernetes/installation/hosted/kubernetes-datastore/caliconetworking/1.7/calico.yaml

sed -i 's/192.168.0.0/10.244.0.0/g' calico.yaml

kubectl apply -f calico.yaml

5.等待几分钟,查看所有Pod的状态,确保所有Pod都是Running状态

kubectl get pod --all-namespaces -o wide

2.2.3 Slave节点需要完成

1.让所有节点让集群环境

使用之前Master节点产生的命令加入集群

kubeadm join 192.168.0.1:6443 --token 754xxxx.xxxxxxxxxxxxxxxx \
--discovery-token-ca-cert-hash
sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
#从master查看加入命令
kubeadm token create --print-join-command

2.启动kubelet

systemctl  start kubelet

3.回到Master节点查看集群搭建状态

如果Status全部为Ready,代表集群环境搭建成功

kubectl get nodes

4.kubectl常用命令

kubectl get nodes 查看所有主从节点的状态
kubectl get ns 获取所有namespace资源
kubectl get pods -n {$nameSpace} 获取指定namespace的pod
kubectl describe pod的名称 -n {$nameSpace} 查看某个pod的执行过程
kubectl logs --tail=1000 pod的名称 | less 查看日志
kubectl create -f xxx.yml 通过配置文件创建一个集群资源对象
kubectl delete -f xxx.yml 通过配置文件删除一个集群资源对象
kubectl delete pod名称 -n {$nameSpace} 通过pod删除集群资源
kubectl get service -n {$nameSpace} 查看pod的service情况

2.3 kubernetes卸载

#还原之前使用 kubeadm init 或者 kubeadm join 对节点所作改变
kubeadm reset

#关闭 kubelet 服务
systemctl stop kubelet

#关闭docker
systemctl stop docker

#删除配置
rm -rf /var/lib/cni/
rm -rf /var/lib/kubelet/*
rm -rf /etc/cni/
ifconfig cni0 down
ifconfig flannel.1 down
ifconfig docker0 down
ip link delete cni0
ip link delete flannel.1

#启动docker
systemctl start docker

#卸载kubernetes的相关安装
yum remove -y kubelet-1.17.2 kubeadm-1.17.2 kubectl-1.17.2

3 kubernetes使用

3.1 kubernetes连接docker仓库

kubectl create secret docker-registry my-secret --docker-server=192.168.0.1:85 --docker-username=admin --docker-password=Harbor12345 --docker-email=admin@163.com

3.2 kubernetes 部署服务

3.2.1 创建命名空间

kubectl create namespace my-namespace

3.2.2 编写一个Pod的配置文件

apiVersion: v1
kind: Service
metadata:
  name: auth
  namespace: my-namespace
  labels:
    app: auth
spec:
  type: NodePort
  ports:
  - port: 9200
    targetPort: 9200
    protocol: TCP
    name: http
  selector:
    app: auth-pod
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: auth-deployment
  namespace: my-namespace
spec:
  selector:
    matchLabels:
      app: auth-pod
  replicas: 1
  template:
    metadata:
      labels:
        app: auth-pod
    spec:
      containers:
      - name: container
        image: 192.168.105.224:85/library-name/auth:1.0.0  #本地私有镜像库的镜像名称+版本
        ports:
        - containerPort: 9200

3.2.3 创建Deployment和Service资源

#启动项目 deployment.yaml为刚才编写的pod文件
kubectl create -f deployment.yaml

# 查看pod详细信息,也就是可以查看pod具体运行在哪个节点上(ip地址信息)
kubectl get pod -o wide

# 查看服务的详细信息,显示了服务名称,类型,集群ip,端口,时间等信息
kubectl get svc
kubectl get svc -n kube-system

4 常用命令

4.1 kubeadm常用命令

kubeadm init 启动引导一个 Kubernetes 主节点
kubeadm join 启动引导一个 Kubernetes 工作节点并且将其加入到集群
kubeadm upgrade 更新 Kubernetes 集群到新版本
kubeadm config 如果你使用 kubeadm v1.7.x 或者更低版本,你需要对你的集群做一些配置以便使用 kubeadmupgrade 命令
kubeadm token 使用 kubeadm join 来管理令牌
kubeadm reset 还原之前使用 kubeadm init 或者 kubeadm join 对节点所作改变
kubeadm version 打印出 kubeadm 版本
kubeadm alpha 预览一组可用的新功能以便从社区搜集反馈
kubeadm token create --print-join-command 创建node加入口令

4.2 kubectl常用命令

4.2.1 基础命令

**create 命令:**根据文件或者输入来创建资源

#创建Deployment和Service资源
kubectl create -f demo-deployment.yaml
kubectl create -f demo-service.yaml

**delete 命令:**删除资源

# 根据yaml文件删除对应的资源,但是yaml文件并不会被删除,这样更加高效
kubectl delete -f demo-deployment.yaml 
kubectl delete -f demo-service.yaml
# 也可以通过具体的资源名称来进行删除,使用这个删除资源,同时删除deployment和service资源
kubectl delete 具体的资源名称

**get 命令 :**获得资源信息

# 查看所有的资源信息
kubectl get all
kubectl get --all-namespaces

# 查看pod列表
kubectl get pod

# 显示pod节点的标签信息
kubectl get pod --show-labels

# 根据指定标签匹配到具体的pod
kubectl get pods -l app=example

# 查看node节点列表
kubectl get node 

# 显示node节点的标签信息
kubectl get node --show-labels

# 查看pod详细信息,也就是可以查看pod具体运行在哪个节点上(ip地址信息)
kubectl get pod -o wide

# 查看服务的详细信息,显示了服务名称,类型,集群ip,端口,时间等信息
kubectl get svc
kubectl get svc -n kube-system

# 查看命名空间
kubectl get ns
kubectl get namespaces

# 查看所有pod所属的命名空间
kubectl get pod --all-namespaces

# 查看所有pod所属的命名空间并且查看都在哪些节点上运行
kubectl get pod --all-namespaces  -o wide

# 查看目前所有的replica set,显示了所有的pod的副本数,以及他们的可用数量以及状态等信息
kubectl get rs

# 查看已经部署了的所有应用,可以看到容器,以及容器所用的镜像,标签等信息
kubectl get deploy -o wide
kubectl get deployments -o wide

**run 命令:**在集群中创建并运行一个或多个容器镜像。

# 示例,运行一个名称为nginx,副本数为3,标签为app=example,镜像为nginx:1.10,端口为80的容器实例
kubectl run nginx --replicas=3 --labels="app=example" --image=nginx:1.10 --port=80
# 示例,运行一个名称为nginx,副本数为3,标签为app=example,镜像为nginx:1.10,端口为80的容器实例,并绑定到k8s-node1上
kubectl run nginx --image=nginx:1.10 --replicas=3 --labels="app=example" --port=80 --overrides='{"apiVersion":"apps/v1","spec":{"template":{"spec":{"nodeSelector":{"kubernetes.io/hostname":"k8s-node1"}}}}}'

expose 命令:创建一个service服务,并且暴露端口让外部可以访问

# 创建一个nginx服务并且暴露端口让外界可以访问
kubectl expose deployment nginx --port=88 --type=NodePort --target-port=80 --name=nginx-service

set 命令:配置应用的一些特定资源,也可以修改应用已有的资源

kubectl set resources 命令:这个命令用于设置资源的一些范围限制

# 将deployment的nginx容器cpu限制为“200m”,将内存设置为“512Mi”
kubectl set resources deployment nginx -c=nginx --limits=cpu=200m,memory=512Mi

# 设置所有nginx容器中 Requests和Limits
kubectl set resources deployment nginx --limits=cpu=200m,memory=512Mi --requests=cpu=100m,memory=256Mi

# 删除nginx中容器的计算资源值
kubectl set resources deployment nginx --limits=cpu=0,memory=0 --requests=cpu=0,memory=0

**kubectl set selector 命令:**设置资源的 selector(选择器)。如果在调用"set selector"命令之前已经存在选择器,则新创建的选择器将覆盖原来的选择器。

kubectl set image 命令:用于更新现有资源的容器镜像。

# 将deployment中的nginx容器镜像设置为“nginx:1.9.1”
kubectl set image deployment/nginx busybox=busybox nginx=nginx:1.9.1

# 所有deployment和rc的nginx容器镜像更新为“nginx:1.9.1”
kubectl set image deployments,rc nginx=nginx:1.9.1 --all

# 将daemonset abc的所有容器镜像更新为“nginx:1.9.1”
kubectl set image daemonset abc *=nginx:1.9.1

# 从本地文件中更新nginx容器镜像
kubectl set image -f path/to/file.yaml nginx=nginx:1.9.1 --local -o yaml

explain 命令:用于显示资源文档信息

kubectl explain rs

edit 命令: 用于编辑资源信息

# 编辑Deployment nginx的一些信息
kubectl edit deployment nginx

# 编辑service类型的nginx的一些信息
kubectl edit service/nginx

4.2.2 设置命令

label命令: 用于更新(增加、修改或删除)资源上的 label(标签)

# 给名为foo的Pod添加label unhealthy=true
kubectl label pods foo unhealthy=true

# 给名为foo的Pod修改label 为 'status' / value 'unhealthy',且覆盖现有的value
kubectl label --overwrite pods foo status=unhealthy

# 给 namespace 中的所有 pod 添加 label
kubectl label  pods --all status=unhealthy

# 仅当resource-version=1时才更新 名为foo的Pod上的label
kubectl label pods foo status=unhealthy --resource-version=1

# 删除名为“bar”的label 。(使用“ - ”减号相连)
kubectl label pods foo bar-

annotate命令:更新一个或多个资源的Annotations信息。也就是注解信息,可以方便的查看做了哪些操作。

# 更新Pod“foo”,设置annotation “description”的value “my frontend”,如果同一个annotation多次设置,则只使用最后设置的value值
kubectl annotate pods foo description='my frontend'

# 根据“pod.json”中的type和name更新pod的annotation
kubectl annotate -f pod.json description='my frontend'

# 更新Pod"foo",设置annotation“description”的value“my frontend running nginx”,覆盖现有的值
kubectl annotate --overwrite pods foo description='my frontend running nginx'

# 更新 namespace中的所有pod
kubectl annotate pods --all description='my frontend running nginx'

# 只有当resource-version为1时,才更新pod 'foo'
kubectl annotate pods foo description='my frontend running nginx' --resource-version=1

# 通过删除名为“description”的annotations来更新pod 'foo'。
# 不需要 -overwrite flag。
kubectl annotate pods foo description-

completion命令:用于设置 kubectl 命令自动补全

# 在 bash 中设置当前 shell 的自动补全,要先安装 bash-completion 包
source <(kubectl completion bash)

# 在您的 bash shell 中永久的添加自动补全
echo "source <(kubectl completion bash)" >> ~/.bashrc 

4.2.3 部署命令

rollout 命令: 用于对资源进行管理

# 语法
kubectl rollout SUBCOMMAND

# 回滚到之前的deployment
kubectl rollout undo deployment/abc

# 查看daemonet的状态
kubectl rollout status daemonset/foo

rolling-update命令: 执行指定ReplicationController的滚动更新。

# 使用frontend-v2.json中的新RC数据更新frontend-v1的pod
kubectl rolling-update frontend-v1 -f frontend-v2.json

# 使用JSON数据更新frontend-v1的pod
cat frontend-v2.json | kubectl rolling-update frontend-v1 -f -

# 其他的一些滚动更新
kubectl rolling-update frontend-v1 frontend-v2 --image=image:v2

kubectl rolling-update frontend --image=image:v2

kubectl rolling-update frontend-v1 frontend-v2 --rollback

scale命令:扩容或缩容 DeploymentReplicaSetReplication ControllerJobPod数量

# 将名为foo中的pod副本数设置为3。
kubectl scale --replicas=3 rs/foo
kubectl scale deploy/nginx --replicas=30

# 将由“foo.yaml”配置文件中指定的资源对象和名称标识的Pod资源副本设为3
kubectl scale --replicas=3 -f foo.yaml

# 如果当前副本数为2,则将其扩展至3。
kubectl scale --current-replicas=2 --replicas=3 deployment/mysql

# 设置多个RC中Pod副本数量
kubectl scale --replicas=5 rc/foo rc/bar rc/baz

autoscale命令:这个比scale更加强大,也是弹性伸缩策略 ,它是根据流量的多少来自动进行扩展或者缩容。

# 使用 Deployment “foo”设定,使用默认的自动伸缩策略,指定目标CPU使用率,使其Pod数量在2到10之间
kubectl autoscale deployment foo --min=2 --max=10

# 使用RC“foo”设定,使其Pod的数量介于1和5之间,CPU使用率维持在80%
kubectl autoscale rc foo --max=5 --cpu-percent=80

4.2.4 集群管理命令

certificate命令:用于证书资源管理,授权等

# 例如,当有node节点要向master请求,那么是需要master节点授权的
kubectl certificate approve node-csr-81F5uBehyEyLWco5qavBsxc1GzFcZk3aFM3XW5rT3mw node-csr-Ed0kbFhc_q7qx14H3QpqLIUs0uKo036O2SnFpIheM18

cluster-info 命令:显示集群信息

kubectl cluster-info

top 命令:用于查看资源的cpu,内存磁盘等资源的使用率

# 以前需要heapster,后替换为metrics-server
kubectl top pod --all-namespaces

cordon命令:用于标记某个节点不可调度

uncordon命令:用于标签节点可以调度

drain命令: 用于在维护期间排除节点。

taint命令:用于给某个Node节点设置污点

4.2.5 集群故障排查和调试命令

describe命令:显示特定资源的详细信息

logs命令:用于在一个pod中打印一个容器的日志,如果pod中只有一个容器,可以省略容器名

# 返回仅包含一个容器的pod nginx的日志快照
kubectl logs nginx

# 返回pod ruby中已经停止的容器web-1的日志快照
kubectl logs -p -c ruby web-1

# 持续输出pod ruby中的容器web-1的日志
kubectl logs -f -c ruby web-1

# 仅输出pod nginx中最近的20条日志
kubectl logs --tail=20 nginx

# 输出pod nginx中最近一小时内产生的所有日志
kubectl logs --since=1h nginx

exec命令:进入容器进行交互,在容器中执行命令

# 进入nginx容器,执行一些命令操作
kubectl exec -it nginx-deployment-58d6d6ccb8-lc5fp bash

attach命令:连接到一个正在运行的容器。

# 获取正在运行中的pod 123456-7890的输出,默认连接到第一个容器
kubectl attach 123456-7890

# 获取pod 123456-7890中ruby-container的输出
kubectl attach 123456-7890 -c ruby-container

# 切换到终端模式,将控制台输入发送到pod 123456-7890的ruby-container的“bash”命令,并将其输出到控制台/
# 错误控制台的信息发送回客户端。
kubectl attach 123456-7890 -c ruby-container -i -t

cp命令:拷贝文件或者目录到pod容器中

4.2.6 其他命令

api-servions命令:打印受支持的api版本信息

# 打印当前集群支持的api版本
kubectl api-versions

help命令:用于查看命令帮助

# 显示全部的命令帮助提示
kubectl --help

# 具体的子命令帮助,例如
kubectl create --help

config 命令: 用于修改kubeconfig配置文件(用于访问api,例如配置认证信息)

# 打印客户端和服务端版本信息
kubectl version

version 命令:打印客户端和服务端版本信息

# 打印客户端和服务端版本信息
kubectl version

plugin 命令:运行一个命令行插件

4.2.7 高级命令

apply命令:通过文件名或者标准输入对资源应用配置

# 将pod.json中的配置应用到pod
kubectl apply -f ./pod.json

# 将控制台输入的JSON配置应用到Pod
cat pod.json | kubectl apply -f -

patch命令:使用补丁修改,更新资源的字段,也就是修改资源的部分内容

# Partially update a node using strategic merge patch
kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}'

# Update a container's image; spec.containers[*].name is required because it's a merge key
kubectl patch pod valid-pod -p '{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"new image"}]}}'

replace命令: 通过文件或者标准输入替换原有资源

# Replace a pod using the data in pod.json.
kubectl replace -f ./pod.json

# Replace a pod based on the JSON passed into stdin.
cat pod.json | kubectl replace -f -

# Update a single-container pod's image version (tag) to v4
kubectl get pod mypod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | kubectl replace -f -

# Force replace, delete and then re-create the resource
kubectl replace --force -f ./pod.json

convert命令:不同的版本之间转换配置文件

# Convert 'pod.yaml' to latest version and print to stdout.
kubectl convert -f pod.yaml

# Convert the live state of the resource specified by 'pod.yaml' to the latest version
# and print to stdout in json format.
kubectl convert -f pod.yaml --local -o json

# Convert all files under current directory to latest version and create them all.
kubectl convert -f . | kubectl create -f -

5 kubenetes扩展

5.1 kubenetes整合rancher

下载镜像

#这里下载的是稳定版本
docker pull rancher/rancher:stable

注意:rancher是一台单独的服务器,不在k8s集群里面。

安装Rancher

docker run -d --restart=always --name rancher -p 80:80 -p 443:443 --privileged rancher/rancher:stable

注意:访问页面必须要用http,即使=用http访问,还是会强制跳转到https

rancher配置k8s集群

点击添加集群>使用现有的 Kubernetes 集群>导入

6 节点可分配资源限制

6.1 简介

k8s 节点健康状态

状态 释义
NodeHasSufficientMemory 节点有足够的内存
NodeHasNoDiskPressure 节点没有磁盘压力
NodeHasSufficientPID 节点有足够的PID
NodeNotReady 节点未准备好

查看节点的Capacity和Allocatable

 kubectl describe node <node_name>

6.2 配置cgroup驱动

确认docker的cgroup driver

docker info | grep "Cgroup Driver"
#如果确认docker的Cgroup Driver不是 cgroupfs,则可以通过以下方法配置。

docker配置cgroup驱动为cgroupfs

#编辑 vim /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=cgroupfs"],
  "registry-mirrors": ["http://hub-mirror.c.163.com"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "5"
  },
  "insecure-registries":["192.168.0.1:5000"]
}

修改kubelet cgroup 驱动systemd为cgroupfs

KUBELET_KUBEADM_ARGS="--cgroup-driver=cgroupfs --network-plugin=cni --pod-infra-container-image=nexus.10010sh.cn/pause:3.1"

6.3 Kubelet Node Allocatable

配置 修改/var/lib/kubelet/kubeadm-flags.env

KUBELET_KUBEADM_ARGS="--cgroup-driver=cgroupfs --network-plugin=cni --pod-infra-container-image=nexus.10010sh.cn/pause:3.1 \
    --enforce-node-allocatable=pods,kube-reserved,system-reserved \
    --kube-reserved-cgroup=/system.slice/kubelet.service \
    --system-reserved-cgroup=/system.slice \
    --kube-reserved=cpu=1,memory=1Gi \
    --system-reserved=cpu=1,memory=1Gi  \
    --eviction-hard=memory.available<5%,nodefs.available<10%,imagefs.available<10% \
    --eviction-soft=memory.available<10%,nodefs.available<15%,imagefs.available<15% \
    --eviction-soft-grace-period=memory.available=2m,nodefs.available=2m,imagefs.available=2m \
    --eviction-max-pod-grace-period=30 \
    --eviction-minimum-reclaim=memory.available=0Mi,nodefs.available=500Mi,imagefs.available=500Mi"

配置解析

  1. 开启为kube组件和系统守护进程预留资源的功能
--enforce-node-allocatable=pods,kube-reserved,system-reserved
  1. 设置k8s组件的cgroup
--kube-reserved-cgroup=/system.slice/kubelet.service
  1. 设置系统守护进程的cgroup
--system-reserved-cgroup=/system.slice
  1. 配置为k8s组件预留资源的大小,CPU、MEM
--kube-reserved=cpu=1,memory=1G
  1. 配置为系统进程(诸如 sshd、udev 等系统守护进程)预留资源的大小,CPU、MEM
--system-reserved=cpu=1,memory=1Gi
  1. 驱逐pod的配置:硬阈值(保证95%的内存利用率)
--eviction-hard=memory.available<5%,nodefs.available<10%,imagefs.available<10%
  1. 驱逐pod的配置:软阈值
--eviction-soft=memory.available<10%,nodefs.available<15%,imagefs.available<15%
  1. 定义达到软阈值之后,持续时间超过多久才进行驱逐
--eviction-soft-grace-period=memory.available=2m,nodefs.available=2m,imagefs.available=2m
  1. 驱逐pod前最大等待时间=min(pod.Spec.TerminationGracePeriodSeconds, eviction-max-pod-grace-period),单位秒
--eviction-max-pod-grace-period=30
  1. 至少回收多少资源,才停止驱逐
--eviction-minimum-reclaim=memory.available=0Mi,nodefs.available=500Mi,imagefs.available=500Mi

6.4 修改Kubelet启动service文件

打开/lib/systemd/system/kubelet.service

[Unit]
Description=kubelet: The Kubernetes Node Agent
Documentation=https://kubernetes.io/docs/home/

[Service]
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/cpuset/system.slice/kubelet.service
ExecStartPre=/bin/mkdir -p /sys/fs/cgroup/hugetlb/system.slice/kubelet.service
ExecStart=/usr/bin/kubelet
Restart=always
StartLimitInterval=0
RestartSec=10

[Install]
WantedBy=multi-user.target

6.5 重启kubelet 和docker服务

加载配置

systemctl daemon-reload

重启kubectl和docker

systemctl restart docker && systemctl restart kubelet
上一篇:从0到1使用Kubernetes系列(六):数据持久化实战


下一篇:Python数据结构与算法之图的广度优先与深度优先搜索算法示例