kubectl
kube-apiserver
kube-controller-manager
kube-scheduler
kube-proxy
kubelet
etcd
网络组件
DNS
集群是一组节点,这些节点可以是物理服务器或者虚拟机,之上安装了Kubernetes平台
Kubernetes简化架构图
集群控制节点,负责整个集群的管理和控制。基本上所有控制命令都是在master上运行
master通常会占据一个独立的服务器(高可用部署建议用3台服务器)
运行的关键进程
kube-apiserver
kube-controller-manager
kube-scheduler
etcd
kubectl
Kubernetes集群中除了master的其他机器被称为Node,在较早的版本中也被称为Minion
Node是Kubernetes集群中的工作负载节点,每个Node都会被Master分配一些工作负载(Docker容器),当某个Node宕机时,其上的工作负载会被Master自动转移到其他节点上
运行的关键进程
kubelet
kube-proxy
Docker Engine(docker)
Node可以在运行期间动态增加到Kubernetes集群中, 前提是在这个节点上已经正确安装、配置和启动了上述关键进程
默认情况下kubelet会向Master注册自己,这也是Kubernetes推荐的Node管理方式
一旦Node被纳入集群管理范围, kubelet进程就会定时向Master汇报自身的情报(操作系统、 Docker版本、机器的CPU和内存情况,以及当前有哪些Pod在运行等)
这样 Master就可以获知每个Node的资源使用情况,并实现高效均衡的资源调度策略
当某个Node在超过指定时间不上报信息时,会被Master判定为“失联”, Node的状态被标记为不可用( Not Ready)。随后Master会触发“工作负载大转移”的自动流程
Pod包含一组紧密相关的容器,每个Pod中都运行着一个特殊的Pause容器,其他容器则为业务容器,这些业务容器共享Pause容器的网络栈和Volume挂载卷,实现localhost通信和文件共享。Pod是短暂的,不是持续性实体
怎么持久化容器数据
创建同一个容器的多份拷贝
怎么从前端容器正确可靠地指向后台容器
一个Label是attach到Pod的一对键/值对,用来传递用户定义的属性,可以通过Label Selector(标签选择器)查询和筛选拥有某些Label的资源对象
常用Labe
版本标签
环境标签
架构标签
分区标签
质量管控标签
Replication Controller确保任意时间都有指定数量的Pod"副本"在运行
如果为某个Pod创建了Replication Controller并且指定3个副本,它会创建3个Pod,并且持续监控它们
某个pod不响应就替换掉,恢复了就干掉一个,运行过程中总数发生变化,则相应地启动或终止差额数量的pod
创建Replication Controller时需指定Pod副本模板和要监控的Label标签
pod副本上如何负载均衡
通过在Deployment中描述所期望的集群状态,Deployment Controller会将现在的集群状态在一个可控的速度下逐步更新成所期望的集群状态
在某种程度上,Deployment可以实现无人值守的上线,大大降低上线过程的复杂沟通、操作风险
功能
RC全部功能
事件和状态查看
回滚
版本记录
暂停和启动
多种升级方案
Recreate
RollingUpdate
比RC优势
工作流程图
Service是定义一系列Pod以及访问这些Pod的策略的一层抽象概念。Service通过Label找到Pod组
通信
LoadBalancer
访问Service
Node IP
Pod IP
Cluster IP
Kubernetes集群之内,Node IP网、Pod IP网与Cluster IP网之间的通信,采用的是Kubernetes自己设计的一种编程方式的特殊路由规则
架构
Kubernetes Master
控制组件,调度管理整个系统(集群)
Kubernetes API Server
Kubernetes Scheduler
Kubernetes Controller
Replication Controller
Node Controller
Namespace Controller
Service Controller
EndPoints Controller
Service Account Controller
Persistent Volume Controller
Daemon Set Controller
Deployment Controller
Job Controller
Pod Autoscaler Controller
Kubernetes Node
运行节点,运行管理业务容器
Kubelet
Kubernetes Proxy
Docker
系统环境
软件环境
服务器规划
2U2G
关闭防火墙、selinux,互相解析,配置集群时间同步
关闭swap
配置内核参数
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
#sysctl -p /etc/sysctl.d/kubernetes.conf
- 更新内核(7.6以下的系统)
- yum update kernel -y
shutdown -r now
安装配置docker
(所有node节点)
[root@node ~]# systemctl enable docker;systemctl start docker
下载二进制包
(master节点)
Etcd简介
etcd是 CoreOS 推出的一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法,etcd基于Go语言实现。
特点
简单
安全
快速
可靠
服务发现
etcd是一个服务发现系统,发现同一个分布式集群中的进程或服务并建立连接
必备属性
构建自身高可用集群方式
静态发现
Etcd动态发现
DNS动态发现
端口
2379
2380
集群
服务组件
二进制程序
配置文件
创建CA证书
设置系统命令
创建CA配置文件
配置证书生成策略,规定CA可以颁发哪种类型的证书
[root@master ~]# mkdir -p /etc/etcd/ssl
[root@master ~]# cd /etc/etcd/ssl
[root@master ssl]# vim ca-config.json
{
“signing”: {
“default”: {
“expiry”: “87600h”
},
“profiles”: {
“www”: {
“expiry”: “87600h”,
“usages”: [
“signing”,
“key encipherment”,
“server auth”,
“client auth”
]
}
}
}
}
[root@master ssl]# vim ca-csr.json
{
“CN”: “etcd CA”,
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “CN”,
“L”: “GuangDong”,
“ST”: “GuangZhou”
}
]
}
生成CA和私钥
配置集群
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS=“https://1.1.1.21:2380”
ETCD_ADVERTISE_CLIENT_URLS=“https://1.1.1.21:2379”
ETCD_INITIAL_CLUSTER=“etcd-01=https://1.1.1.21:2380,etcd-02=https://1.1.1.22:2380,etcd-03=https://1.1.1.23:2380”
ETCD_INITIAL_CLUSTER_TOKEN=“etcd-cluster”
ETCD_INITIAL_CLUSTER_STATE=“new”
- [root@master ~]# vim /usr/lib/systemd/system/etcd.service #创建systemd启动文件
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
EnvironmentFile=/etc/etcd/etcd.conf
ExecStart=/usr/local/bin/etcd
–name= E T C D N A M E − − d a t a − d i r = {ETCD_NAME} \ --data-dir= ETCDNAME −−data−dir={ETCD_DATA_DIR}
–listen-peer-urls= E T C D L I S T E N P E E R U R L S − − l i s t e n − c l i e n t − u r l s = {ETCD_LISTEN_PEER_URLS} \ --listen-client-urls= ETCDLISTENPEERURLS −−listen−client−urls={ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379
–advertise-client-urls= E T C D A D V E R T I S E C L I E N T U R L S − − i n i t i a l − a d v e r t i s e − p e e r − u r l s = {ETCD_ADVERTISE_CLIENT_URLS} \ --initial-advertise-peer-urls= ETCDADVERTISECLIENTURLS −−initial−advertise−peer−urls={ETCD_INITIAL_ADVERTISE_PEER_URLS}
–initial-cluster= E T C D I N I T I A L C L U S T E R − − i n i t i a l − c l u s t e r − t o k e n = {ETCD_INITIAL_CLUSTER} \ --initial-cluster-token= ETCDINITIALCLUSTER −−initial−cluster−token={ETCD_INITIAL_CLUSTER_TOKEN}
–initial-cluster-state=new
–cert-file=/etc/etcd/ssl/server.pem
–key-file=/etc/etcd/ssl/server-key.pem
–peer-cert-file=/etc/etcd/ssl/server.pem
–peer-key-file=/etc/etcd/ssl/server-key.pem
–trusted-ca-file=/etc/etcd/ssl/ca.pem
–peer-trusted-ca-file=/etc/etcd/ssl/ca.pem
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
- [root@master ~]# scp /usr/local/bin/etcd* node1:/usr/local/bin/ # 二进制命令
[root@master ~]# scp /usr/local/bin/etcd* node2:/usr/local/bin/
[root@master ~]# scp -r /etc/etcd/ node1:/etc/ # 配置文件, 包括证书文件
[root@master ~]# scp -r /etc/etcd/ node2:/etc/
[root@master ~]# scp /usr/lib/systemd/system/etcd.service node1:/usr/lib/systemd/system/
[root@master ~]# scp /usr/lib/systemd/system/etcd.service node2:/usr/lib/systemd/system/
- [root@node1&2 ~]# vim /etc/etcd/etcd.conf
- 修改节点名称及IP
启动集群
查看集群状态
Flannel简介
可执行程序
配置文件
功能
原理图
过程
数据从源容器中发出后,经由所在主机的docker0虚拟网卡转发到flannel0虚拟网卡,这是个P2P的虚拟网卡,flanneld服务监听在网卡的另外一端
Flannel通过Etcd服务维护了一张节点间的路由表,分配了每个节点可用的IP地址段(不重复),再修改Docker的启动参数(设置地址段),确保集群中所有容器IP不会重复
源主机的flanneld服务将原本的数据内容UDP封装后根据自己的路由表投递给目的节点的flanneld服务,数据到达以后被解包,然后直接进入目的节点的flannel0虚拟网卡,然后被转发到目的主机的docker0虚拟网卡,最后就像本机容器通信一样由docker0路由到达目标容器
UDP封装
路由
向etcd写入集群Pod网段信息
(任意etcd节点)
安装Flannel
[root@all ~]# vim /usr/lib/systemd/system/flanneld.service
[Unit]
Description=Flanneld overlay address etcd agent
After=network-online.target network.target
Before=docker.service
[Service]
Type=notify
EnvironmentFile=/etc/flannel.conf
ExecStart=/usr/local/bin/flanneld --ip-masq $FLANNEL_OPTIONS
ExecStartPost=/usr/local/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/subnet.env
Restart=on-failure
[Install]
WantedBy=multi-user.target
配置Docker启动指定子网段
启动flannel, 重启docker
验证是否生效
[root@master ~]# cd /etc/etcd/ssl/
[root@master ssl]# etcdctl ls /coreos.com/network/subnets
输出所有节点的子网信息:
/coreos.com/network/subnets/10.244.92.0-24
/coreos.com/network/subnets/10.244.69.0-24
/coreos.com/network/subnets/10.244.71.0-24
简介
运行的组件
目录
创建CA证书
[root@master ~]# mkdir -p /etc/kubernetes/ssl
[root@master ~]# cd /etc/kubernetes/ssl
[root@master ssl]# vim ca-config.json
{
“signing”: {
“default”: {
“expiry”: “87600h”
},
“profiles”: {
“kubernetes”: {
“expiry”: “87600h”,
“usages”: [
“signing”,
“key encipherment”,
“server auth”,
“client auth”
]
}
}
}
}
[root@master ssl]# vim ca-csr.json
{
“CN”: “kubernetes”,
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “CN”,
“L”: “GuangDong”,
“ST”: “GuangZhou”,
“O”: “k8s”,
“OU”: “System”
}
]
}
[root@master ssl]# cfssl_linux-amd64 gencert -initca ca-csr.json | cfssljson_linux-amd64 -bare ca
[root@master ssl]# cfssl_linux-amd64 gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson_linux-amd64 -bare server
部署kube-apiserver
配置主程序
创建Token文件
创建配置文件
创建启动文件
[Service]
EnvironmentFile=-/etc/kubernetes/apiserver
ExecStart=/usr/local/bin/kube-apiserver $KUBE_APISERVER_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
- 启动服务
- [root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl start kube-apiserver;systemctl enable kube-apiserver
[root@master ~]# systemctl status kube-apiserver
部署kube-scheduler
创建配置文件
创建启动文件
[Service]
EnvironmentFile=-/etc/kubernetes/kube-scheduler.conf
ExecStart=/usr/local/bin/kube-scheduler $KUBE_SCHEDULER_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
- 启动服务
- [root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl start kube-scheduler;systemctl enable kube-scheduler
[root@master ~]# systemctl status kube-scheduler
部署kube-controller-manager
创建配置文件
创建启动文件
[Service]
EnvironmentFile=-/etc/kubernetes/kube-controller-manager.conf
ExecStart=/usr/local/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
- 启动服务
- [root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl start kube-controller-manager
[root@master ~]# systemctl enable kube-controller-manager
[root@master ~]# systemctl status kube-controller-manager
- 检查各服务状态及Master集群状态
- [root@master ~]# kubectl get cs
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-2 Healthy {“health”:“true”}
etcd-1 Healthy {“health”:“true”}
etcd-0 Healthy {“health”:“true”}
You have new mail in /var/spool/mail/root
简介
Master apiserver启用TLS认证后,Node节点kubelet组件想要加入集群,必须使用CA签发的有效证书才能与apiserver通信,节点很多时需用到TLS Bootstrapping机制
Kubelet会以一个低权限用户自动向apiserver申请证书,kubelet的证书由apiserver动态签署
运行组件
目录
部署kubelet
创建目录
创建kube-proxy证书
创建kubelet bootstrap kubeconfig文件
cd $KUBE_SSL
kubectl config set-cluster kubernetes
–certificate-authority=./ca.pem
–embed-certs=true
–server=${KUBE_APISERVER}
–kubeconfig=bootstrap.kubeconfig
kubectl config set-credentials kubelet-bootstrap
–token=${BOOTSTRAP_TOKEN}
–kubeconfig=bootstrap.kubeconfig
kubectl config set-context default
–cluster=kubernetes
–user=kubelet-bootstrap
–kubeconfig=bootstrap.kubeconfig
kubectl config use-context default --kubeconfig=bootstrap.kubeconfig
kubectl config set-cluster kubernetes
–certificate-authority=./ca.pem
–embed-certs=true
–server=${KUBE_APISERVER}
–kubeconfig=kube-proxy.kubeconfig
kubectl config set-credentials kube-proxy
–client-certificate=./kube-proxy.pem
–client-key=./kube-proxy-key.pem
–embed-certs=true
–kubeconfig=kube-proxy.kubeconfig
kubectl config set-context default
–cluster=kubernetes
–user=kube-proxy
–kubeconfig=kube-proxy.kubeconfig
kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
- [root@master ~]# sh bs_kubeconfig.sh
- [root@master ~]# kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap # 将 kubelet-bootstrap 用户绑定到系统集群角色
- 拷贝
- [root@master ~]# scp kubernetes/server/bin/{kubelet,kube-proxy} node1:/usr/local/bin/
[root@master ~]# scp kubernetes/server/bin/{kubelet,kube-proxy} node2:/usr/local/bin/
[root@master ~]# scp /etc/kubernetes/ssl/.kubeconfig node1:/etc/kubernetes/
[root@master ~]# scp /etc/kubernetes/ssl/.kubeconfig node2:/etc/kubernetes/
- 创建kubelet配置文件
- [root@node1&2 ~]# cd /etc/kubernetes/
[root@node1&2 kubernetes]# vim kubelet.conf
KUBELET_OPTS=“–logtostderr=true
–v=4
–hostname-override=1.1.1.22
–kubeconfig=/etc/kubernetes/kubelet.kubeconfig
–bootstrap-kubeconfig=/etc/kubernetes/bootstrap.kubeconfig
–config=/etc/kubernetes/kubelet.yaml
–cert-dir=/etc/kubernetes/ssl
–pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0”
- 创建kubelet参数配置模板文件
- [root@node1&2 kubernetes]# vim kubelet.yaml
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: 1.1.1.22
port: 10250
readOnlyPort: 10255
cgroupDriver: cgroupfs
clusterDNS: [“10.0.0.2”]
clusterDomain: cluster.local.
failSwapOn: false
authentication:
anonymous:
enabled: true
- 创建启动文件
- [root@node1&2 kubernetes]# vim /usr/lib/systemd/system/kubelet.service
[Unit]
Description=Kubernetes Kubelet
After=docker.service
Requires=docker.service
[Service]
EnvironmentFile=/etc/kubernetes/kubelet.conf
ExecStart=/usr/local/bin/kubelet $KUBELET_OPTS
Restart=on-failure
KillMode=process
[Install]
WantedBy=multi-user.target
- 启动服务
- [root@node1&2 kubernetes]# systemctl daemon-reload
[root@node1&2 kubernetes]# systemctl start kubelet
[root@node1&2 kubernetes]# systemctl enable kubelet
[root@node1&2 kubernetes]# systemctl status kubelet
部署kube-proxy
创建配置文件
创建启动文件
[Service]
EnvironmentFile=-/etc/kubernetes/kube-proxy.conf
ExecStart=/usr/local/bin/kube-proxy $KUBE_PROXY_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
- 启动服务
- [root@node1&2 kubernetes]# systemctl daemon-reload
[root@node1&2 kubernetes]# systemctl start kube-proxy
[root@node1&2 kubernetes]# systemctl enable kube-proxy
[root@node1&2 kubernetes]# systemctl status kube-proxy
同意CSR请求
介绍
查看请求CSR列表
手动approve CSR
查看集群状态
设置开机启动以后,软件并不会立即启动,必须等到下一次开机。想要立即启动执行systemctl start httpd
执行启动命令后有可能启动失败,需要执行systemctl status httpd命令查看服务的状态
服务状态输出结果含义
一个服务怎么启动,完全由它的启动文件决定,文件主要放在/usr/lib/systemd/system目录,也可能在/etc/systemd/system目录
例:sshd
[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
模块
[Unit]
启动顺序与依赖关系
Description: 当前服务描述信息
Documentation: 文档位置
启动顺序
依赖关系
[Service]
启动行为,定义如何启动当前服务
启动命令
Type-启动类型
重启行为
KillMode
Restart
RestartSec
[Install]
定义如何安装这个配置文件,即怎样做到开机启动
WantedBy
systemctl get-default
systemctl list-dependencies multi-user.target
常用的 Target
multi-user.target
graphical.target
systemctl cat multi-user.target
Requires: 要求basic.target一起运行
Conflicts: 冲突字段。如果rescue.service或rescue.target正在运行,multi-user.target就不能运行,反之亦然
After:表示multi-user.target在basic.target 、 rescue.service、 rescue.target之后启动,如果它们有启动的话
AllowIsolate:允许使用systemctl isolate命令切换到multi-user.targe
单Master部署
高可用集群部署
背景
方案
步骤
堆叠
etcd提供的分布式数据存储集群与由kubeadm管理的运行master组件的集群节点堆叠部署
每个master节点运行kube-apiserver,kube-scheduler和kube-controller-manager的一个实例。kube-apiserver使用负载平衡器暴露给工作节点
每个master节点创建一个本地etcd成员,该etcd成员仅与本节点kube-apiserver通信。这同样适用于本地kube-controller-manager 和kube-scheduler实例
优势
劣势
外部
由etcd提供的分布式数据存储集群部署在运行master组件的节点形成的集群外部
在外部ETCD拓扑中的每个master节点运行一个kube-apiserver,kube-scheduler和kube-controller-manager实例。并且kube-apiserver使用负载平衡器暴露给工作节点。但是,etcd成员在不同的主机上运行,每个etcd主机与kube-apiserver每个master节点进行通信
优势
劣势
参考文档
环境准备
服务器2U2G
关闭防火墙、selinux,互相解析,时间同步,禁用swap分区,配置内核参数,升级内核
加载ipvs模块
[root@master1 ~]# yum install ipset ipvsadm -y
[root@master1 ~]# 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
[root@master1 ~]# chmod +x /etc/sysconfig/modules/ipvs.modules
[root@master1 ~]# /etc/sysconfig/modules/ipvs.modules
[root@master1 ~]# lsmod |egrep ‘ip_vs|nf_conntrack’
安装配置docker
安装docker(略)- 建议安装19.03版
配置docker
启动docker
安装负载均衡
介绍
创建haproxy启动脚本
创建keepalived启动脚本
运行测试
安装kubeadm
配置yum源
查询版本
安装软件
设置开机启动kubelet
初始化master1
创建初始化配置文件
修改初始化配置文件
初始化
[root@master1 k8s]# kubeadm init --config=init.yml --upload-certs |tee kubeadm-init.log
成功后注意查看输出信息,包含配置kubectl命令、加入master节点命令、加入worker节点命令
如果中途失败,执行 kubeadm reset 命令清理,再次初始化,然后再执行init或join操作
init主要操作
修改yaml文件
配置kubectl命令
通过配置文件
通过环境变量
查看Pod
查看组件状态
查看node
安装网络插件
[root@master1 ~]# kubectl apply -f https://gitee.com/leedon21/k8s/raw/master/kube-flannel.yml
仅在Master1节点操作
查看Pod
查看node
加入master节点
从初始化输出或kubeadm-init.log中获取命令将master2和master3加入到集群中来
例
--discovery-token-ca-cert-hash sha256:673d71fd341c79d3a013993c546bbf529f8626506f8d14fc69f0be376956e56f \ --control-plane --certificate-key b696a3afc89a8c60e130028d66be172c348ee80c789fcec6f79f759142eea6b8
- 分别在master2和master3上配置好命令行工具kubectl
加入node节点
Kubernetes 的 Worker 节点跟 Master 节点几乎是相同的,它们运行着的都是一个 kubelet 组件
唯一的区别在于,Master 节点上还会自动运行 kube-apiserver、kube-scheduler、kube-controller-manger 这三个系统 Pod
从init的输出或kubeadm-init.log文件中获取命令将node节点加入到集群中来
例
--discovery-token-ca-cert-hash sha256:673d71fd341c79d3a013993c546bbf529f8626506f8d14fc69f0be376956e56f
- 验证
- 查看Pod
- [root@master ~]# kubectl get po -n kube-system
- 查看node
- [root@master ~]# kubectl get no
- 查看代理规则
- [root@master ~]# ipvsadm -Ln
参考文档
清理高可用集群环境
重置
删除节点
清理cni配置
清理ipvs
清理iptables
删除kubeconfig文件
删除容器
docker ps -a -q
重启
修改配置
初始化文件
解析文件
主机名
初始化
配置kubectl命令
修改文件
安装网络插件
加入node节点
从init的输出或kubeadm-init.log文件中获取命令将node节点加入到集群中来
验证
查看Pod
查看node
查看代理规则
token
默认生成的 token 有效期为 24 小时,如果希望生成一个永久生效的,可加选项 --ttl=0
查看token状态
[root@master1 ~]# kubeadm token list
生成token
discovery-token-ca-cert-hash
certificate-key
生成join命令
worker节点join
master节点join
参考
原因
查看证书信息
解决方法
方案1-升级集群
方案2-手动更新证书
所有master节点上执行
备份
更新证书
查看
重启各组件
更新 kubectl 的 token
名称
缩写
NAMESPACED(可被隔离)
pods
po
true
nodes
no
false
namespaces
ns
deployments
deploy
true
services
svc
true
http://NodeIP:32567
超管
只读
get
apply
describe
logs
delete
create
certificate
api-resources
api-versions
explain
语法
SOURCE_TYPE
资源类型,如:nodes、pods、namespaces…
kubectl get namespace
kubectl get po -A
kubectl get no
SOURCE_NAME
选项
-o
指定输出格式,json|yaml|wide|name…
-o wide
-o yaml
-n NAMESPACE
-A
Kubernetes 跟 Docker 等很多项目最大的不同,就在于它不推荐你使用命令行的方式直接运行容器
而是希望你用 YAML 文件的方式,即:把资源对象的定义、参数、配置,统统记录在一个 YAML 文件中,然后用’kubectl apply -f 配置文件’指令把它运行起来
好处
语法规则
结构类型
Maps
Lists
介绍
编写yaml
apiVersion: v1 #资源版本号,kubectl api-resources查看
kind: Pod #资源类型,kubectl api-resources查看
metadata: #meta信息,比如名称、namespace、标签等信息
name: my-nginx #pod名称
namespace: default #命名空间,不指定默认使用default
labels: #标签
app: nginx
spec: #详细描述
containers: #容器(多个)
如果Pod出现了故障的话,对应的服务也就挂掉了,因此Kubernetes提供了一个Deployment的概念 ,目的是让Kubernetes去管理一组Pod的副本,也就是副本集 ,这样就能够保证一定数量的副本一直可用
编写yaml
service介绍
简述
类型
ClusterIP
NodePort
LoadBalancer
ExternalName
另外,也可以将已有的服务以 Service 的形式加入到 Kubernetes 集群中来,只需要在创建 Service 的时候不指定 Label selector,而是在 Service 创建好后手动为其添加 endpoint
网络代理模式
kube-proxy 负责为 Service 实现了一种 VIP(虚拟 IP)而非ExternalName的形式,Kubernetes v1.0代理完全在userspace,v1.1新增iptables,v1.2默认iptables代理
userspace
iptables
ipvs
如何工作
编写yaml
文档
k8s v1.20 API
其他版本直接修改版本号即可
API 版本
为了使删除字段或者重构资源表示更加容易,Kubernetes 支持 多个API版本。每一个版本都在不同API路径下,例如 /api/v1 或者 /apis/extensions/v1beta1
Alpha 测试版本
Beta 测试版本
稳定版本
API 组
命令
kubectl api-versions
kubectl api-resources
kubectl explain RESOURCE-NAME
介绍
默认Namespace
default
kube-node-lease
kube-public
kube-system
namespace操作
查看
创建
apiVersion: v1
kind: Namespace
metadata:
name: myns
- 删除
- kubectl delete ns test-ns
- kubectl delete -f myns.yaml
介绍
RBAC
ABAC
区别
RBAC优势
基本概念
Role
Subject
RoleBinding
注
Role
角色,一个角色包含了一套表示一组权限的规则,权限以累加形式累积(没有”否定”的规则)。Role的权限规则仅在指定的namespace内有效
定义
apiGroups: [“”] #限定的API组列表,""空表示核心组api/v1
resources: [“pods”] #限定的资源对象列表,如pods、 deployments等
verbs: [“get”,“watch”,“list”] #权限列表,这些表示只读权限
resourceNames: [“xxx”] #指定具体的一个或多个资源
RoleBinding
角色绑定,引用在同一namespace内定义的Role对象将权限授予一个或者一组主体subject
定义
kind: User #被引用对象的种类:“User”, “Group”, “ServiceAccount”
name: jane
apiGroup: rbac.authorization.k8s.io
roleRef: #只能引用当前 Namespace 里的 Role 对象
kind: Role
name: pod-reader #前面定义的pod只读权限
apiGroup: rbac.authorization.k8s.io
ClusterRole和ClusterRoleBinding
用法跟 Role 和 RoleBinding 完全一样。只不过它们的定义里没有Namespace字段,作用范围为整个集群
授权对象
所有权限
预置ClusterRole
cluster-admin
admin
edit
view
ServiceAccount
由 Kubernetes 负责管理的“内置用户”,简写sa
定义sa
secret
Kubernetes 会为一个 ServiceAccount 自动创建并分配一个 Secret 对象
这个Secret,就是这个 ServiceAccount 对应的、用来跟 APIServer 进行交互的授权文件,我们一般称它为:Token
kubectl describe sa test-sa
tocken
Token 文件的内容一般是证书或者密码,它以一个 Secret 对象的方式保存在 Etcd 当中
kubectl describe secret test-sa-token-xxxxx
pod声明
default
Pod是Kubernetes中最重要也最基本的概念
每个Pod都有一个特殊的被称为“根容器”的Pause容器。除此之外,每个Pod还包含一到多个紧密相关的用户业务容器
根容器Pause占用内存极少且不易死亡,以它的状态代表整个容器组的状态
Pod里的多个业务容器共享 Pause容器的IP, 共享 Pause容器挂载的 Volume
静态Pod
普通Pod
explain命令查询
文档查询
较完整内容
问题
解决