K8s 脑图笔记
K8s 脑图笔记K8s简介k8s常用概念k8s架构基于k8s的常见web应用部署架构Kubernetes服务于微服务Kubernetes的主要组成k8s集群的运行时的大致结构Kubernetes设计架构分层架构基于Docker本地运行Kubernetes使用容器的优点K8s 命令Podkubernetes LableReplication Controller (RC)Kubernetes Dep
·
K8s 脑图笔记
- K8s简介
- k8s常用概念
- k8s架构
- 基于k8s的常见web应用部署架构
- Kubernetes服务于微服务
- Kubernetes的主要组成
- k8s集群的运行时的大致结构
- Kubernetes设计架构
- 分层架构
- 基于Docker本地运行Kubernetes
- 使用容器的优点
- K8s 命令
- Pod
- kubernetes Lable
- Replication Controller (RC)
- Kubernetes Deployment
- Kubernetes Service
- NodePort与Load balancer
- Kubernetes Namespace
- 其他图
- 其他
- K8S 简介2
- K8s架构图
- Kubernetes
- Kubernetes相关术语
- 部署
- 1124
- 重置kubernetes服务,重置网络。删除网络配置,link
- 集群联邦
- 访问集群
- 1125
- 简介
- Borg 简介
- Kubernetes 架构
- 分层架构
- 核心组件
- 核心 API
- 生态系统
- API设计原则
- 控制机制设计原则
- 架构设计原则
- 引导(Bootstrapping)原则
- 微服务Pod
- 复制控制器(Replication Controller,RC)
- 副本集(Replica Set,RS)
- 部署(Deployment)
- 服务(Service)
- 核心组件
- 组件通信
- 访问控制
- 工作原理
- API 访问
- Controller Manager
- 容器运行时接口(Container Runtime Interface,CRI)
- kubelet 工作原理
- Pod 启动流程
- 查询 Node 汇总指标
- kube-proxy 工作原理
- 初始化系统
- kubectl
- 部署app历史
- 集群
- 命令2
- Service
- 架构
- 架构
- pod基本操作
- master安装部署
- node节点安装部署
- k8s网络之Flannel网络
- 部署
- 1127
K8s简介
k8s常用概念
k8s架构
基于k8s的常见web应用部署架构
Kubernetes服务于微服务
每个微服务都是独立的进程,通过定义好的接口(restful api ,amqp)互相调用
Kubernetes的主要组成
k8s集群的运行时的大致结构
Kubernetes设计架构
分层架构
基于Docker本地运行Kubernetes
使用容器的优点
K8s 命令
# 查看集群中有多少个Node
kubectl get nodes
# 查看某个Node的详细信息
kubectl describe node
# 查看Deployment的信息
kubectl get deployments
# 查看对应的Replica Set
kubectl get rs
# 查看创建的Pod
kubectl get pods
# 查看Endpoint列表
kubectl get endpoints
#看到 nginx 被分配的Cluster IP及更多的信息
kubectl get svc nginx -o yaml
# 查看命名空间
kubectl get namespaces
# kubectl命令中加入--namespace参数来查看某个命名空间中的对象
kubectl get pods --namespace=development
# 查看pod信息
kubectl get -n kube-system pod|grep "kube-proxy(pod)"
kubectl -n kube-system logs -f +pod
# kubectl get - 类似于 docker ps,查询资源列表
# kubectl describe - 类似于 docker inspect,获取资源的详细信息
# kubectl logs - 类似于 docker logs,获取容器的日志
# kubectl exec - 类似于 docker exec,在容器内执行一个命令
kubectl run --image=nginx:alpine nginx-app --port=80
kubectl get pods
kubectl exec nginx-app-4028413181-cnt1i ps aux
kubectl describe pod nginx-app-4028413181-cnt1i
kubectl scale --replicas=3 deployment/nginx-app
kubectl get deploy
# ---------------------------------- 系列 命令 1
# kubectl [command] [TYPE] [NAME] [flags]
kubectl get pods
kubectl exec -ti nginx-7bb7cd8db5-42lcn date
kubectl describe pod nginx-7bb7cd8db5-42lcn
# 部署服务
kubectl expose deployment nginx-app --port=80 --target-port=80 --type=NodePort
kubectl get deployment
# 扩展应用
kubectl scale --replicas=3 deployment/nginx
# 滚动升级(Rolling Update)
kubectl rolling-update frontend-v1 frontend-v2 --image=image:v2
# 回滚
kubectl rolling-update frontend-v1 frontend-v2 --rollback
# 在使用 kubectl 时,打开调试日志也可以看到每个 API 调用的格式
kubectl --v=8 get pods
# 查询 Kubernetes API 支持的 API 版本以及资源对象
kubectl api-versions
kubectl api-resources
kubectl api-resources --api-group=storage.k8s.io
# Node 打上标签 指定 nodeSelector 为 disktype=ssd
kubectl label nodes node-01 disktype=ssd
# ----------------------------------
Pod
每个Pod都会被分配一个单独的IP地址,
而且每个Pod都提供了一个独立的Endpoint(Pod IP+ContainerPort)以被客户端访问,
现在多个Pod副本组成了一个集群来提供服务
负载均衡器
运行在每个Node上的kube-proxy进程其实就是一个智能的软件负载均衡器,
它负责把对Service的请求转发到后端的某个Pod实例上,并在内部实现服务的负载均衡与会话机制
每个Service分配了全局唯一的虚拟IP地址,这个虚拟IP地址被称为Cluster IP。
这样一来,每个服务就变成了具备唯一IP地址的“通信节点”,服务调用就变成了最基础的TCP网络通信问题。
kubernetes Lable
一个Label是一个key=value的键值对
Replication Controller (RC)
Kubernetes Deployment
Kubernetes Service
Pod、RC与Service的逻辑关系
通过分析、识别并建模系统中的所有服务为微服务-----Kubernetes Service,
最终我们的系统由多个提供不同业务能力而又彼此独立的微服务单元所组成,
服务之间通过TCP/IP进行通信,
从而形成了我们强大而又灵活的弹性网格,
拥有了强大的分布式能力、弹性扩展能力、容错能力,于此同时,
我们的程序架构也变得简单和直观许多
NodePort与Load balancer
Kubernetes Namespace
Nameaspace通过将集群内部的资源对象“分配”到不同的Namespce中,
形成逻辑上分组的不同项目、小组或用户组,
便于不同的分组在共享使用整个集群的资源的同时还能被分别管理
其他图
K8s 集群中,与节点就绪状态有关的组件,
主要有四个,分别是:集群的核心数据库 etcd、集群的入口 API Server、节点控制器以及驻守在集群节点上直接管理节点的 kubelet。
其他
公有云巨头(谷歌、亚马逊、微软、华为云、阿里云等等)都在其传统的公共云服务之上提供托管的Kubernetes服务
K8S 简介2
开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能
K8s架构图
Kubernetes
k8s
自动实施 Linux 容器操作的开源平台
Google
徽标 Project Seven of Nine
Kubernetes相关术语
主机(Master)
节点(Node)
容器集(Pod)
复制控制器(Replication controller)
服务(Service)
Kubelet
kubectl
部署
预先准备信息
防火墙与 SELinux
$ systemctl stop firewalld && systemctl disable firewalld
$ setenforce 0
$ vim /etc/selinux/config
SELINUX=disabled
设定/etc/host解析到所有主机
安装Docker引擎
curl -fsSL "https://get.docker.com/" | sh
systemctl enable docker && systemctl start docker
部署kubeadm和kubelet
设置k8s国内yum仓库
cat >/etc/yum.repos.d/kubernetes.repo<<EOF
[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 https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装kubeadm
yum install -y kubelet-1.16.2 kubeadm-1.16.2 kubectl-1.16.2 ipvsadm
设置k8s禁止使用swap
cat > /etc/sysconfig/kubelet<<EOF
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
EOF
设置内核参数
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
设置kubelet开机启动
systemctl enable kubelet && systemctl start kubelet
加载IPVS模块
cat >/etc/sysconfig/modules/ipvs.modules<<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
chmod +x /etc/sysconfig/modules/ipvs.modules
source /etc/sysconfig/modules/ipvs.modules
lsmod | grep -e ip_vs -e nf_conntrack_ipv
node1节点初始化
kubeadm init \
--apiserver-advertise-address=192.168.108.130 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.16.2 \
--service-cidr=192.168.108.0/24 \
--pod-network-cidr=192.168.108.0/24 \
--service-dns-domain=cluster.local \
--ignore-preflight-errors=Swap \
--ignore-preflight-errors=NumCPU
为kubectl准备kubeconfig
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
获取node节点信息
kubectl get nodes
支持命令补全
yum install bash-completion -y
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
kubectl completion bash >/etc/bash_completion.d/kubectl
设置kube-proxy使用ipvs模式
#执行命令,然后将mode: ""修改为mode: "ipvs"然后保存退出
kubectl edit cm kube-proxy -n kube-system
#重启kube-proxy
kubectl get pod -n kube-system |grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'
#查看pod信息
kubectl get -n kube-system pod|grep "kube-proxy"
#检查日志,如果出现IPVS rr就表示成功
[root@node1 ~]# kubectl -n kube-system logs -f kube-proxy-7cdbn
kubeadm token create --print-join-command
1124
Container(容器)是一种便携式、轻量级的操作系统级虚拟化技术
Pod 是一组紧密关联的容器集合,
它们共享 PID、IPC、Network 和 UTS namespace,是 Kubernetes 调度的基本单位。
在 Kubernetes 中,所有对象都使用 manifest(yaml 或 json)来定义
重置kubernetes服务,重置网络。删除网络配置,link
# 可疑 谨慎使用
kubeadm reset
systemctl stop kubelet
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
systemctl start docker
集群联邦
访问集群
在 cluster 内部就可以通过 http://Cluster-IP 和 http://node-ip:30772 来访问 nginx-app。
而在 cluster 外面,则只能通过 http://node-ip:30772 来访问
1125
简介
面向应用的容器集群部署和管理系统
Borg 简介
Kubernetes 架构
核心组件:
etcd 保存了整个集群的状态;
kube-apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制;
kube-controller-manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
kube-scheduler 负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;
kubelet 负责维持容器的生命周期,同时也负责 Volume(CVI)和网络(CNI)的管理;
Container runtime 负责镜像管理以及 Pod 和容器的真正运行(CRI),默认的容器运行时为 Docker;
kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡;
推荐的 Add-ons:
kube-dns 负责为整个集群提供 DNS 服务
Ingress Controller 为服务提供外网入口
Heapster 提供资源监控
Dashboard 提供 GUI
Federation 提供跨可用区的集群
Fluentd-elasticsearch 提供集群日志采集、存储与查询
分层架构
核心组件
核心 API
生态系统
API设计原则
声明式 声明式的API还隐含了所有的API对象都是名词性质的
API对象是彼此互补而且可组合的 高内聚,松耦合
高层API以操作意图为基础设计
低层API根据高层API的控制需要设计
尽量避免简单封装,不要有在外部API无法显式知道的内部隐藏的机制
API操作复杂度与对象数量成正比
API对象状态不能依赖于网络连接状态
尽量避免让操作机制依赖于全局状态,因为在分布式系统中要保证全局状态的同步是非常困难的
控制机制设计原则
架构设计原则
引导(Bootstrapping)原则
每个API对象都有3大类属性:元数据metadata、规范spec和状态status。
元数据是用来标识API对象的,
每个对象都至少有3个元数据:namespace,name和uid;
除此以外还有各种各样的标签labels用来标识和匹配不同的对象,
例如用户可以用标签env来标识区分不同的服务部署环境
微服务Pod
Pod是在K8s集群中运行部署应用或服务的最小单元,它是可以支持多容器的
Pod的设计理念是支持多个容器在一个Pod中共享网络地址和文件系统,
可以通过进程间通信和文件共享这种简单高效的方式组合完成服务
目前K8s中的业务主要可以分为长期伺服型(long-running)、
批处理型(batch)、
节点后台支撑型(node-daemon)
和有状态应用型(stateful application);
分别对应的小机器人控制器为Deployment、
Job、
DaemonSet
和StatefulSet。
复制控制器(Replication Controller,RC)
只适用于长期伺服型的业务类型
副本集(Replica Set,RS)
RS是新一代RC
作为Deployment的理想状态参数使用
部署(Deployment)
部署表示用户对K8s集群的一次更新操作
服务(Service)
RC、RS和Deployment只是保证了支撑服务的微服务Pod的数量
服务发现完成的工作,是针对客户端访问的服务,找到对应的的后端服务实例。
在K8s集群中,客户端需要访问的服务就是Service对象。
每个Service会对应一个集群内部有效的虚拟IP,集群内部通过虚拟IP访问一个服务。
在K8s集群中微服务的负载均衡是由Kube-proxy实现的。
Kube-proxy是K8s集群内部的负载均衡器。它是一个分布式代理服务器,
在K8s的每个节点上都有一个。
核心组件
组件通信
典型的创建 Pod 的流程
端口号
etcd
基本的 key-value 存储
访问控制
认证、授权以及准入控制(Admission Control)
工作原理
API 访问
kubectl
kubectl get --raw /api/v1/namespaces
kubectl get --raw /apis/metrics.k8s.io/v1beta1/nodes
kubectl get --raw /apis/metrics.k8s.io/v1beta1/pods
kubectl proxy
kubectl proxy --port=8080 &
Controller Manager
kube-controller-manager 由一系列的控制器组成
Replication Controller
Node Controller
CronJob Controller
Daemon Controller
Deployment Controller
Endpoint Controller
Garbage Collector
Namespace Controller
Job Controller
Pod AutoScaler
RelicaSet
Service Controller
ServiceAccount Controller
StatefulSet Controller
Volume Controller
Resource quota Controller
容器运行时接口(Container Runtime Interface,CRI)
kubelet 工作原理
Pod 启动流程
查询 Node 汇总指标
通过 Kubelet 的 10255 端口可以查询 Node 的汇总指标。
有两种访问方式
在集群内部可以直接访问 kubelet 的 10255 端口,
比如 http://<node-name>:10255/stats/summary
在集群外部可以借助 kubectl proxy 来访问,比如
kubectl proxy&
curl http://localhost:8001/api/v1/proxy/nodes/<node-name>:10255/stats/summary
kube-proxy 工作原理
初始化系统
所有机器都需要初始化容器执行引擎(如 docker 或 frakti 等)和 kubelet。
这是因为 kubeadm 依赖 kubelet 来启动 Master 组件
kubeadm init --pod-network-cidr 10.244.0.0/16 --kubernetes-version stable
kubectl
kubectl -h 查看子命令列表
kubectl options 查看全局选项
kubectl <command> --help 查看子命令的帮助
kubectl [command] [PARAMS] -o=<format> 设置输出格式(如 json、yaml、jsonpath 等)
kubectl explain [RESOURCE] 查看资源的定义
创建:kubectl run <name> --image=<image> 或者 kubectl create -f manifest.yaml
查询:kubectl get <resource>
更新 kubectl set 或者 kubectl patch
删除:kubectl delete <resource> <name> 或者 kubectl delete -f manifest.yaml
查询 Pod IP:kubectl get pod <pod-name> -o jsonpath='{.status.podIP}'
容器内执行命令:kubectl exec -ti <pod-name> sh
容器日志:kubectl logs [-f] <pod-name>
导出服务:kubectl expose deploy <name> --port=80
kubectl logs
kubectl attach
kubectl exec
kubectl port-forward
kubectl proxy
kubectl cp
部署app历史
集群
通过发布 Deployment,可以创建应用程序 (docker image) 的实例 (docker container),
这个实例会被包含在称为 Pod 的概念中,
Pod 是 k8s 中最小可管理单元
命令2
# kubectl get - 显示资源列表
#获取类型为Deployment的资源列表
kubectl get deployments
#获取类型为Pod的资源列表
kubectl get pods
#获取类型为Node的资源列表
kubectl get nodes
# 查看所有名称空间的 Deployment
# 命令后增加 -A 或 --all-namespaces 可查看所有 名称空间中 的对象,
# 使用参数 -n 可查看指定名称空间的对象
kubectl get deployments -A
kubectl get deployments --all-namespaces
# 查看 kube-system 名称空间的 Deployment
kubectl get deployments -n kube-system
# kubectl describe - 显示有关资源的详细信息
# kubectl describe 资源类型 资源名称
#查看名称为nginx-XXXXXX的Pod的信息
kubectl describe pod nginx-XXXXXX
#查看名称为nginx的Deployment的信息
kubectl describe deployment nginx
# kubectl logs Pod名称
#查看名称为nginx-pod-XXXXXXX的Pod内的容器打印的日志
#本案例中的 nginx-pod 没有输出日志,所以您看到的结果是空的
kubectl logs -f nginx-pod-XXXXXXX
# kubectl exec Pod名称 操作命令
# 在名称为nginx-pod-xxxxxx的Pod中运行bash
kubectl exec -it nginx-pod-xxxxxx /bin/bash
Service
kubectl apply -f nginx-service.yaml
kubectl get services -o wide
架构
架构
pod基本操作
创建 kubectl create -f xxx.yaml
查询 kubectl get pod yourPodName kubectl describe pod yourPodName
删除 kubectl delete pod yourPodName kubectl delete -f xxx.yaml
更新 kubectl replace /path/to/yourNewYaml.yml
master安装部署
yum install etcd kubernetes-master -y
# 编辑/etc/etcd/etcd.conf文件
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_NAME="default"
ETCD_ADVERTISE_CLIENT_URLS="http://localhost:2379"
# 编辑/etc/kubernetes/apiserver文件
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_API_PORT="--port=8080"
KUBELET_PORT="--kubelet-port=10250"
KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota"
KUBE_API_ARGS=""
# 启动etcd、kube-apiserver、kube-controller-manager、kube-scheduler等服务,并设置开机启动
for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler;
do systemctl start $SERVICES;
systemctl enable $SERVICES;
systemctl status $SERVICES;
done
# 在etcd中定义flannel网络
etcdctl mk /atomic.io/network/config '{"Network":"172.40.0.0/16"}'
node节点安装部署
yum install flannel kubernetes-node -y
# 为flannel网络指定etcd服务,修改/etc/sysconfig/flanneld文件
cat /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://10.1.14.11:2379"
FLANNEL_ETCD_PREFIX="/atomic.io/network"
# 修改/etc/kubernetes/config文件
cat /etc/kubernetes/config
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://10.1.14.11:8080"
# 修改node节点配置文件/etc/kubernetes/kubelet
cat /etc/kubernetes/kubelet
KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_PORT="--port=10250"
KUBELET_HOSTNAME="--hostname-override=10.1.14.15"
KUBELET_API_SERVER="--api-servers=http://10.1.14.11:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""
for SERVICES in flanneld docker kube-proxy kubelet;do systemctl start $SERVICES;systemctl enable $SERVICES;systemctl status $SERVICES; done
k8s网络之Flannel网络
部署
https://blog.csdn.net/magerguo/article/details/72123259
https://www.yisu.com/zixun/23228.html
1127
kubectl scale rc ng-rc --replicas=1
更多推荐
已为社区贡献1条内容
所有评论(0)