K8s简介

K8s简介

k8s常用概念

k8s常用概念

k8s架构

k8s架构

基于k8s的常见web应用部署架构

基于k8s的常见web应用部署架构

Kubernetes服务于微服务

Kubernetes服务于微服务

	每个微服务都是独立的进程,通过定义好的接口(restful api ,amqp)互相调用

Kubernetes的主要组成

Kubernetes的主要组成

k8s集群的运行时的大致结构

k8s集群的运行时的大致结构

Kubernetes设计架构

Kubernetes设计架构
在这里插入图片描述
在这里插入图片描述

分层架构

分层架构

基于Docker本地运行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
Pod2
Pod3

	每个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的键值对

Lable
Lable2

Replication Controller (RC)

RC
RC1
RC2

Kubernetes Deployment

Kubernetes Service

Pod、RC与Service的逻辑关系

Service

	通过分析、识别并建模系统中的所有服务为微服务-----Kubernetes Service,
	最终我们的系统由多个提供不同业务能力而又彼此独立的微服务单元所组成,
	服务之间通过TCP/IP进行通信,
	从而形成了我们强大而又灵活的弹性网格,
	拥有了强大的分布式能力、弹性扩展能力、容错能力,于此同时,
	我们的程序架构也变得简单和直观许多

Kubernetes所提供的微服务网格架构

NodePort与Load balancer

NodePort与Load balancer

Kubernetes Namespace

	Nameaspace通过将集群内部的资源对象“分配”到不同的Namespce中,
	形成逻辑上分组的不同项目、小组或用户组,
	便于不同的分组在共享使用整个集群的资源的同时还能被分别管理

其他图

	K8s 集群中,与节点就绪状态有关的组件,
	主要有四个,分别是:集群的核心数据库 etcd、集群的入口 API Server、节点控制器以及驻守在集群节点上直接管理节点的 kubelet。

节点就绪状态有关的组件

节点就绪状态有关的组件

其他

公有云巨头(谷歌、亚马逊、微软、华为云、阿里云等等)都在其传统的公共云服务之上提供托管的Kubernetes服务

K8S 简介2

开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能

管理节点与工作节点

K8s架构图

K8s架构图
K8s架构图2
K8s架构图2
K8s架构图3

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 调度的基本单位。

Pod

在 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 简介

Borg

Kubernetes 架构

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 存储

etcd

访问控制

认证、授权以及准入控制(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

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 工作原理

kubelet 工作原理

Pod 启动流程

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 工作原理

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

在这里插入图片描述

Logo

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

更多推荐