K8S

k8s

介绍

pad控制器
掌握各种控制器的特点以及使用定义方式

服务发现
掌握svc原理以及构建方式

存储
掌握多种存储类型的特点

调度器
掌握调度器原理,能根据要求把pod定义到想要的节点运行

安全
集群的认证 鉴权 访问控制原理及其流程

helm
掌握helm原理 helm模板自定义,helm模板自定义,helm部署一些常用插件

主要组件

  1. apiserver
    所有服务访问统一入口

  2. CrontrollerManager
    维护副本期望数目

  3. scheduler
    负责介绍任务,选择合适的节点进行分配任务

  4. etcd
    键值对数据库,存储k8s集群所有重要的信息(持久化)

  5. kubelet
    直接跟容器引擎交互实现的生命周期管理

  6. kube-proxy
    负责写入规则至iptables,ipvs实现服务映射访问的

其他插件

  1. CireDNS

    可以为集群中的svc创建一个域名ip的对应解析

  2. Dashboard
    给k8s集群提供一个b/s结构的访问体系

  3. incresss controller
    官方只能实现四成代理,ingess可以实现七成代理

  4. federation
    提供一个可以跨集群中心多k8s统一管理功能

  5. Prometheus
    提供k8s集群的监控能力

  6. elk
    提供k8s集群日志统一分析继而平台

kubernetes资源类别介绍

类别 名称
资源对象 Pod、ReplicaSet、ReplicationController、Deployment、StatefulSet、DaemonSet、Job、CronJob、HorizontalPodAutoscaling
配置对象 Node、Namespace、Service、Secret、ConfigMap、Ingress、Label、ThirdPartyResource、 ServiceAccount
存储对象 Volume、Persistent Volume
策略对象 SecurityContext、ResourceQuota、LimitRange

pod

pod介绍

在Kubernetes集群中,Pod是所有业务类型的基础,也是K8S管理的最小单位级,它是一个或多个容器的组合。这些容器共享存储、网络和命名空间,以及如何运行的规范。在Pod中,所有容器都被同一安排和调度,并运行在共享的上下文中。对于具体应用而言,Pod是它们的逻辑主机,Pod包含业务相关的多个应用容器。

ped控制器类型

  1. ReplicationController(新版本已抛弃)
    它能够保证Pod持续运行,并且在任何时候都有指定数量的Pod副本,在此基础上提供一些高级特性,比如滚动升级和弹性伸缩

  2. ReplicaSet
    是ReplicationController的代替物,因此用法基本相同,唯一的区别在于ReplicaSet支持集合式的selector

  3. Deployment
    是用来管理无状态应用的,面向的集群的管理,而不是面向的是一个不可变的个体
    它可以实现对template模板进行实时滚动更新,更加方便的管理Pod和Replica Set

  4. Horizontal Pod Autoscaler
    根据观察到的CPU使用率(或使用自定义指标 支持,基于某些其他应用程序提供的指标)自动缩放复制控制器

  5. statefulset
    为解决有有状态服务问题,StatefulSet为其每个Pod维护一个粘性身份。这些Pod是根据相同的规范创建的,但不可互换:每个Pod都有一个永久性标识符,该标识符在任何重新计划中都会维护。

稳定的唯一网络标识符:pod重新调度后其podname和hostname不变,基于headless service实现
稳定,持久的存储:pod重新调动后还是能访问到相同的持久化数据,基于pvc实现
有序,顺畅的部署和扩展:在扩展或者部署时按定义的顺序依次进行,基于init containers来实现
有序的自动滚动更新:有序收缩删除

  1. daemonset
    DaemonSet确保集群中每个(部分)node运行一份pod副本,当node加入集群时创建pod,当node离开集群时回收pod。如果删除DaemonSet,其创建的所有pod也被删除,

运行集群存储daemon,例如在每个node上运行glusterfs,ceph
在每个node上运行日志收集daemon,例如fluentd,logstash
在每个node上运行监控daemon,例如promethus

7.job
负责批量处理任务,即执行一次任务,它保证批量处理任务的一个或多个pod成功结束
Job 会创建一个或者多个 Pods,并确保指定数量的 Pods 成功终止。 随着 Pods 成功结束,Job 跟踪记录成功完成的 Pods 个数。 当数量达到指定的成功个数阈值时,任务(即 Job)结束。 删除 Job 的操作会清除所创建的全部 Pods。

8.CronJob
创建基于时间调度的 Job
对于创建周期性的、反复重复的任务很有用,例如执行数据备份

安装

设置系统主机名以及Host文件的相互解析

系统最低配置,两核2G

hostname ip
k8s-master01 10.0.0.2
k8s-slave01 10.0.03
k8s-slave02 10.0.0.4

系统升级优化


rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

#  查看可用的系统内核包
# yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
yum --enablerepo=elrepo-kernel install kernel-lt

# 查看系统上的所有可以内核
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
grub2-set-default 0           # 选着相应标号
init 6


cat  >/etc/sysctl.d/kubernetes.conf<<-EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
# 允许的最大跟踪连接条目,是在内核内存中 netfilter 可以同时处理的“任务”(连接跟踪条目)
net.netfilter.nf_conntrack_max=10485760
net.netfilter.nf_conntrack_tcp_timeout_established=300
# 哈希表大小(只读)(64位系统、8G内存默认 65536,16G翻倍,如此类推)
net.netfilter.nf_conntrack_buckets=655360
# 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.core.netdev_max_backlog=10000

# 表示socket监听(listen)的backlog上限,也就是就是socket的监听队列,当一个tcp连接尚未被处理或建立时(半连接状态),会保存在这个监听队列
net.core.somaxconn=32768
# 没有启用syncookies的情况下,syn queue(半连接队列)大小除了受somaxconn限制外,也受这个参数的限制,默认1024,优化到8096,避免在高并发场景下丢包
net.ipv4.tcp_max_syn_backlog=8096
# 表示同一用户同时最大可以创建的 inotify 实例 (每个实例可以有很多 watch)
fs.inotify.max_user_instances=8192
# max-file 表示系统级别的能够打开的文件句柄的数量, 一般如果遇到文件句柄达到上限时,会碰到
# Too many open files 或者 Socket/File: Can’t open so many files 等错误
fs.file-max=2097152
# 表示同一用户同时可以添加的watch数目(watch一般是针对目录,决定了同时同一用户可以监控的目录数量) 默认值 8192 在容器场景下偏小,在某些情况下可能会导致 inotify watch 数量耗尽,使得创建 Pod 不成功或者 kubelet 无法启动成功,将其优化到 524288
fs.inotify.max_user_watches=524288

net.core.bpf_jit_enable=1

net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_rmem=4096 12582912 16777216
net.ipv4.tcp_wmem=4096 12582912 16777216
net.core.rps_sock_flow_entries=8192

# 以下三个参数是 arp 缓存的 gc 阀值,相比默认值提高了,当内核维护的 arp 表过于庞大时候,可以考虑优化下,避免在某些场景下arp缓存溢出导致网络超时,参考:https://k8s.imroc.io/avoid/cases/arp-cache-overflow-causes-healthcheck-failed

# 存在于 ARP 高速缓存中的最少层数,如果少于这个数,垃圾收集器将不会运行。缺省值是 128
net.ipv4.neigh.default.gc_thresh1=2048
# 保存在 ARP 高速缓存中的最多的记录软限制。垃圾收集器在开始收集前,允许记录数超过这个数字 5 秒。缺省值是 512
net.ipv4.neigh.default.gc_thresh2=4096
# 保存在 ARP 高速缓存中的最多记录的硬限制,一旦高速缓存中的数目高于此,垃圾收集器将马上运行。缺省值是 1024
net.ipv4.neigh.default.gc_thresh3=8192

net.ipv4.tcp_max_orphans=32768
net.ipv4.tcp_max_tw_buckets=32768
vm.max_map_count=262144
kernel.threads-max=30058
net.ipv4.ip_forward=1
# 避免发生故障时没有 coredump
kernel.core_pattern=core
# 禁用ipv6
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 180
net.ipv4.tcp_max_tw_buckets = 6000
vm.swappiness = 0
EOF

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

cat >>/etc/security/limits.conf<<-EOF
*               -       nofile          204800
EOF
ulimit -n 204800
ulimit -u 204800

systemctl stop firewalld postfix
systemctl disable firewalld postfix

init 6
uname -a

系统准备


cat >>/etc/hosts<<EOF
10.0.0.2  k8s-master01
10.0.0.3  k8s-slave01
10.0.0.4  k8s-slave02
EOF


swapoff -a
sed -i '/ swap /  s/^\(.*\)$/# \1/g' /etc/fstab

sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0

# 时间同步
ntpdate -u  ntp1.aliyun.com
timedatectl set-timezone Asia/Shanghai
timedatectl set-local-rtc 0

# 时间同步定时任务(有必要可以搭建时间服务器)
cat >>/var/spool/cron/root<<-EOF
PATH=/bin:/sbin:/usr/bin:/usr/sbin
# ntpdate
0 */2 * * * ntpdate time1.aliyun.com &>/dev/null && hwclock --systohc
EOF
crontab -u root /var/spool/cron/root
crontab -l -u root

kubeadm 安装


wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

wget -O /etc/yum.repos.d/docker-ce.repo  https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo   

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg 
EOF

yum clean all && yum repolist && yum makecache
yum install -y kubelet kubeadm kubectl



# 编辑 vim /etc/sysconfig/kubelet配置:
KUBELET_EXTRA_ARGS="--fail-swap-on=false"

systemctl enable kubelet && systemctl restart kubelet
systemctl enable docker && systemctl start docker

从kubernetes1.8版本开始,新增了kube-proxy对ipvs的支持

modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4

容器日志配置

配置Journal1日志管理

mkdir /etc/systemd/journald.conf.d
cat >/etc/systemd/journald.conf.d/99-prophet.cong<<-EOF
[Journal]
# 持久化保存到磁盘
Storage=persistent
# 压缩历史日志
Compress=yes

SyncIntervalSec= 5m
RateLimitInterval=30s
RateLimitBurst=1000

# 最大占用空间10G
SystemMaxUse=10G

# 单日志文件最大200M
SystemMaxFileSize=200M

# 日志保存时间2周
MaxRetentionsec=2week

# 不将日志转发到syslog
ForwardToSyslog=no
EOF


systemctl restart systemd-journald

json-file 会将容器的日志保存在.json文件中,日志路径为 /var/lib/docke/container/ID/ID.json.log

Docker 默认的日志驱动程序json-file

centos7的cgroup driver为systemd,docker默认的cgroup driver为cgroupfs,使用两种cgroup driver控制资源的话会导致资源分配不均。


cat  >/etc/docker/daemon.json<<-EOF
{
        "registry-mirrors": [
                "https://6zmzhe7k.mirror.aliyuncs.com"
        ],
        "insecure-registries": [
                "www.harbor.com"
        ],
        "dns": ["8.8.8.8","8.8.4.4"],
        "exec-opts": ["native.cgroupdriver=systemd"],
        "log-driver": "json-file",
        "log-opts": { "max-size" :"100m","max-file":"3"}
}

EOF

master安装

查看此版本的容器镜像版本

kubeadm config images list

初始化主节点 kubeadm reset

  • --apiserver-advertise-address:指定用 Master 的哪个IP地址与 Cluster的其他节点通信。
  • --service-cidr:指定Service网络的范围,即负载均衡VIP使用的IP地址段。
  • --pod-network-cidr:指定Pod网络的范围,即Pod的IP地址段。
  • --image-repository:指定镜像地址
  • --kubernetes-version:指定要安装的版本号

kubeadm config print init-defaults

kubeadm init --upload-certs \
--apiserver-advertise-address=10.0.0.2  \
--pod-network-cidr=10.244.0.0/16 \
--kubernetes-version=v1.19.1  \
--image-repository=www.harbor.com/google_containers \
|tee kubeadm-init.log



mkdir $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

# 配置lpvs
kubectl edit configmap kube-proxy -n kube-system
kubectl delete pod kube-proxy-xxx -n kube-system
ipvsadm -ln

wget https://kuboard.cn/install-script/calico/calico-3.13.1.yaml
kubectl apply -f calico-3.13.1.yaml

calico-kube 状态CrashLoopBackOff

kubectl logs -n kube-system   calico-kube-controllers-XXX
journalctl -f -u kubelet
iptables --flush
iptables -tnat --flush

客户端加入节点

token信息在master初始化日志中

kubeadm token create --print-join-command


kubeadm join 10.0.0.2:6443 --token 54837b.sxu1i7bq67zpehhh \
--discovery-token-ca-cert-hash  \
sha256:37f8d8328c5243a7acd1ba652c4173c181795e33f692eb99d6cc45e150a0203f \
--ignore-preflight-errors=swap

# 添加节点后,节点会从master下载镜像并启动(kubectl get nodes Ready代表成功)
# 查看pod: kubectl get pods -n kube-system -o wide 查看pod

kubectl get nodes

加入失败

kubeadm reset

# If you wish to reset iptables, you must do so manually.For example:
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

# If your cluster was setup to utilize IPVS, run 
ipvsadm --clear

# 再次加入

验证节点


kubectl get  node
NAME           STATUS   ROLES    AGE     VERSION
k8s-master01   Ready    master   27m     v1.19.2
k8s-slave01    Ready    <none>   2m54s   v1.19.2
k8s-slave02    Ready    <none>   5m36s   v1.19.2

资源清单

Yaml格式

简单说明

YAML是一个类似 XML、JSON 的标记性语言。YAML 强调以数据为中心,并不是以标识语言为重点。因而 YAML 本身的定义比较简单,号称“一种人性化的数据格式语言”。

基本语法

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进时不允许使用Tab键,只允许使用空格。
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

数据类型

  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
  • 纯量(scalars):单个的、不可再分的值。字符串,布尔值,整数浮点数,null,时间日期

对象

对象键值对使用冒号结构表示 key: value,冒号后面要加一个空格。

也可以使用 key:{key1: value1, key2: value2, ...}

key: 
    child-key: value
    child-key2: value2

数组

以 - 开头的行表示构成一个数组:

animal
- cat
- dog

可以使用行内表示

animal: [cat, dog]

k8s yaml文件规格参数

kubectl explain pod 查看参数

必要属性

参数名 字段类型 说明
version string 指k8s api版本,目前基本上是v1,可以用kubectl api-versions命令查询
kind string 指yaml文件定义的资源类型和角色,如pod
metadata object 元数据对象,固定值就写metadata
metadata.name string 元数据对象名,命名pod的名字
metadata.namespace string 元数据对象的命名空间
spec object 详细定义对象,固定值就写spec
spec.containers[] list 这里是spec对象的容器列表定义,是个列表

主要对象

参数名 字段类型 说明
spec.containers[].name stringr 这里定义容器名字
spec.containers[].image string 这里定义要用到的镜像名称
spec.containers[].imagePullPolicy string 定义镜像拉取策略,Alawys每次拉取新镜像,IfnotPresent表示优先使用本地镜像,Never仅用本地镜像
spec.containers[].command[] list 指定容器启动命令,应为是数组可以指定多个,不指定使用镜像打包时使用的启动命令
spec.containers[].args[] list 指定容器启动命令参数,因为是数组可以指定多个
spec.containers[].workingdir string 指定容器的工作目录
spec.containers[].volumeMounts[] string 挂载到容器内部的存储卷配置
spec.containers[].volumeMounts[].name string 引用pod定义的共享存储卷的名称
spec.containers[].volumeMounts[].mountPath string 存储卷在容器内mount的绝对路径
spec.containers[].volumeMounts[].readOnly Boolean 是否为只读模式,ture.false 默认读写
spec.containers[].ports[] list 需要暴露的端口库号列表
spec.containers[].ports[].name string 端口的名称
spec.containers[].ports[].containerPort string 容器需要监听的端口号
spec.containers[].ports[].hostPort string 容器所在主机需要监听的端
spec.containers[].ports[].protocol string 端口协议,支持TCP和UDP,默认TCP
spec.containers[].env[] list 容器运行前需设置的环境变量列表
spec.containers[].env[].name string 环境变量名称
spec.containers[].env[].value string 环境变量的值
spec.containers[].resources object 资源限制和请求的设置
spec.containers[].resources.limits object 资源限制的设置
spec.containers[].resources.limits.cpu string Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
spec.containers[].resources.limits.memory string 内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
spec.containers[].resources.requests object 指定容器启动和调度时的限制设置
spec.containers[].resources.requests.cpu string Cpu请求,容器启动的初始化可用数量
spec.containers[].resources.requests.memory string 内存请求,容器启动的初始化可用数量

额外参数项

参数名 字段类型 说明
spec.restartPolicy string Pod的重启策略,Always不管以何种方式终止 都将重启 /OnFailure只有Pod以非0退出码退出才重启 /Nerver不再重启该Pod
spec.nodeSelector object 将该Pod调度到包含这个label的node上,以key:value的格式指定
spec.imagePullSecrets object Pull镜像时使用的secret名称,以key:secretkey格式指定
spec.hostNetwork Boolean 是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络 不使用docker网桥并且无法在同一宿主机启动第二个副本
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351