- 一.k8s的由来及作用
- 1.传统架构分析
- 2.k8s的由来及作用
- 3.k8s的作用
- 二.k8s系统架构
- 1.Master节点组成
- 2.Node节点的组成
- 三.k8s逻辑架构
- 1.POD
- 2.Controller
- 3.Service
- 四.K8S快速部署
- 1.节点规划及环境准备
- 1.1 节点规划
- 1.2 环境准备
- 2.安装docker环境及依赖
- 3.配置主节点ETCD
- 4.配置Master节点
- 5.node节点配置
- 6.验证节点状态
- 7.配置flannel网络
- 8.配置master为镜像仓库
- 二. k8s核心资源管理
- 1.PODS
- 1.1 创建第一个pod
- 1.2 加载容器
- 1.3 查询
- 1.4 创建第二个pod
- 1.5 更新镜像
- 2.RC应用
- 3.depolyment资源管理:
- 4.Service应用
- 4.1 Service部署
- 4.2 Service验证
最传统的架构是所有的页面链接都是建立在一个域名之上,一旦主web服务器down机那么所有服务都无法打开 传统架构的优缺点: 优点: 1)开发简单,集中式管理 2)基本不会重复开发 3)功能都在本地,没有分布式的管理和调用消耗 缺点: 1)效率低:开发都在同一个项目改代码,相互等待,冲突不断 2)维护难:代码功能耦合在一起,新人不知道何从下手 3)不灵活:构建时间长,任何小修改都要重构整个项目,耗时 4)稳定性差:一个微小的问题,都可能导致整个应用挂掉 5)扩展性不够:无法满足高并发下的业务需求2.k8s的由来及作用
1)为了不影响用户的使用,提升应用服务的健壮性,把每个链接都拆分成一个独立的一个服务,单独的模块,相对于其它模块互不影响,对于能够拆分成单独模块的服务简称微服务。 2)对于每个独立的服务都是一个单独的容器运行而来的(假设所有的服务都是由docker部署的),当web服务器处于访问压力过大时如何实现资源的弹性伸缩,服务的自动发现,以及版本的自动更新,如果这些管理都是通过人力来完成,那么将消耗大量的人力和时间,如果有一个统一的管理工具,那么就可以省去很的人力和物力。 3)我们知道kvm虚拟机多的时候可以由openstack来管理,容器数量太多的时候可以通k8s来编排管理。3.k8s的作用
k8s是一个docker集群的管理工具
自愈: 重新启动失败的容器,在节点不可用时,替换和重新调度节点上的容器,对用户定义的健康检查不响应的容器会被中止,并且在容器准备好服务之前不会把其向客户端广播。 弹性伸缩: 通过监控容器的cpu的负载值,如果这个平均高于80%,增加容器的数量,如果这个平均低于10%,减少容器的数量 服务的自动发现和负载均衡: 不需要修改您的应用程序来使用不熟悉的服务发现机制,Kubernetes 为容器提供了自己的 IP 地址和一组容器的单个 DNS 名称,并可以在它们之间进行负载均衡。 升级和一键回滚: Kubernetes 逐渐部署对应用程序或其配置的更改,同时监视应用程序运行状况,以确保它不会同时终止所有实例。 如果出现问题,Kubernetes会为您恢复更改,利用日益增长的部署解决方案的生态系统。 密码管理二.k8s系统架构
从系统架构来看,k8s分为2个节点 Master 控制节点 Node 工作节点1.Master节点组成
API Server :提供k8s API接口 主要处理Rest操作以及更新Etcd中的对象 是所有资源增删改查的唯一入口。 Scheduler:资源调度器 根据etcd里的节点资源状态决定将Pod绑定到哪个Node上 Controller Manager:负责保障pod的健康存在,资源对象的自动化控制中心,Kubernetes集群有很多控制器。 Etcd:这个是Kubernetes集群的数据库,所有持久化的状态信息存储在Etcd中2.Node节点的组成
Docker Engine: 负责节点容器的管理工作,最终创建出来的是一个Docker容器。 kubelet 安装在Node上的代理服务,用来管理Pods以及容器/镜像/Volume等,实现对集群对节点的管理。 kube-proxy 安装在Node上的网络代理服务,提供网络代理以及负载均衡,实现与Service通讯。三.k8s逻辑架构
从逻辑架构上看,k8s分为 Pod Controller Service1.POD
POD是k8s的最小单位 POD的IP地址是随机的,删除POD会改变IP POD都有一个根容器 一个POD内可以由一个或多个容器组成 一个POD内的容器共享根容器的网络命名空间 一个POD内的网络地址由根容器提供2.Controller
用来管理POD,控制器的种类有很多 - RC Replication Controller 控制POD有多个副本 - RS ReplicaSet RC控制的升级版 - Deployment 推荐使用,功能更强大,包含了RS控制器 - DaemonSet 保证所有的Node上有且只有一个Pod在运行 - StatefulSet 有状态的应用,为Pod提供唯一的标识,它可以保证部署和scale的顺序3.Service
NodeIP 对外提供用户访问 CluterIP 集群内部IP,可以动态感知后面的POD IP POD IP POD的IP四.K8S快速部署 1.节点规划及环境准备 1.1 节点规划
k8s-m :10.0.0.11 k8s-n1 :10.0.0.12 k8s-n2 :10.0.0.131.2 环境准备
所有节点: 1.关闭防火墙: systemctl stop firewalld systemctl disable firewalld 2.关闭selinux: sed -i 's/enforcing/disabled/' /etc/selinux/config setenforce 0 3.关闭swap: swapoff -a 临时 vim /etc/fstab 永久 4.添加主机名与IP对应关系(记得设置主机名): cat /etc/hosts master 10.0.0.11 node1 10.0.0.12 node2 10.0.0.13 ......2.安装docker环境及依赖
1.上传docker-k8s.tar软件到各节点/opt,并解压,进入目录进行安装 tar xf docker-k8s.tar cd /opt/pkg yum localinstall -y *.rpm 2.在master:上传k8s-master到/opt 并解压,进入目录进行安装 unzip k8s-master.zip cd /opt/k8s-master yum localinstall -y *.rpm 3.在node1和node2:上传k8s-node到两个node节点/opt 并解压,进入目录进行安装 tar xf k8s-node.tar yum localinstall -y *.rpm 4.在所有节点: vim /usr/lib/systemd/system/docker.service #在[Service]区域下增加一行 ...... [Service] ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT systemctl daemon-reload systemctl restart docker3.配置主节点ETCD
在master节点: vim /etc/etcd/etcd.conf ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" ETCD_ADVERTISE_CLIENT_URLS="http://10.0.0.11:2379" 重启服务并测试 systemctl restart etcd.service systemctl enable etcd.service etcdctl set name lbz etcdctl get name4.配置Master节点
在master节点: vim /etc/kubernetes/apiserver KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0" KUBE_API_PORT="--port=8080" KUBE_ETCD_SERVERS="--etcd-servers=http://10.0.0.11:2379" KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16" KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota" vim /etc/kubernetes/config(当你想要master既做master又做node的时候需要修改这个配置文件,此实验不用) 重启服务 systemctl enable kube-apiserver.service systemctl start kube-apiserver.service systemctl enable kube-controller-manager.service systemctl start kube-controller-manager.service systemctl enable kube-scheduler.service systemctl start kube-scheduler.service5.node节点配置
vim /etc/kubernetes/config KUBE_MASTER="--master=http://10.0.0.11:8080" vim /etc/kubernetes/kubelet KUBELET_ADDRESS="address=10.0.0.12/13" KUBELET_HOSTNAME="--hostname-override=10.0.0.12/13" KUBELET_API_SERVER="--api-servers=http://10.0.0.11:8080" 重启服务 systemctl enable kubelet.service systemctl start kubelet.service systemctl enable kube-proxy.service systemctl start kube-proxy.service6.验证节点状态
[root@master ~]# kubectl get nodes NAME STATUS AGE 10.0.0.12 Ready 4m 10.0.0.13 Ready 4m7.配置flannel网络
1.所有节点:
yum install -y wget
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum install flannel -y
sed -i 's#http://127.0.0.1:2379#http://10.0.0.11:2379#g' /etc/sysconfig/flanneld
2.master节点:
etcdctl mk /atomic.io/network/config '{"Network": "172.16.0.0/16"}'
etcdctl get /atomic.io/network/config
{"Network": "172.16.0.0/16"}
systemctl enable flanneld.service
systemctl start flanneld.service
service docker restart
systemctl restart kube-apiserver.service
systemctl restart kube-controller-manager.service
systemctl restart kube-scheduler.service
3.node节点:
systemctl enable flanneld.service
systemctl start flanneld.service
service docker restart
systemctl restart kubelet.service
systemctl restart kube-proxy.service
8.配置master为镜像仓库
1.master节点 vim /etc/sysconfig/docker 把这一行修改为如下: OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false --regist ry-mirror=https://aeckruos.mirror.aliyuncs.com --insecure-registry=10.0.0.11:5000' 修改完毕 systemctl restart docker 配置本地registry docker pull nginx docker tag nginx 10.0.0.11:5000/lbz/nginx:v1 docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry docker push 10.0.0.11:5000/lbz/nginx:v1 2.node节点 vim /etc/sysconfig/docker 把这一行修改为如下: OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false --insecure-registry=10.0.0.11:5000' 修改完毕 systemctl restart docker docker pull 10.0.0.11:5000/lbz/nginx:v1二. k8s核心资源管理 1.PODS 1.1 创建第一个pod
在master节点:
mkdir /opt/yml/test -p
cd /opt/yml/test
[root@k8s test]# cat k8s_pod.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: web
spec:
containers:
- name: nginx
image: 10.0.0.11:5000/lbz/nginx:v1
ports:
- containerPort: 80
1.2 加载容器
在master节点: master: 上传准备好的容器为本地register (pod-infrastructure-latest.tar.gz) [root@master test]# docker load -i pod-infrastructure-latest.tar.gz [root@master test]# docker images [root@k8s-m opt]# docker tag docker.io/tianyebj/pod-infrastructure:latest 10.0.0.11:5000/lbz/pod-infrastructure:latest [root@master test]# docker images [root@master test]# docker push 10.0.0.11:5000/lbz/pod-infrastructure:latest 在所有node节点: vim /etc/kubernetes/kubelet KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=10.0.0.11:5000/lbz/pod-infrastructure:latest" systemctl restart kubelet.service 在master节点: [root@k8s yml]# kubectl create -f k8s_pod.yml pod "nginx" created1.3 查询
[root@master test]# kubectl describe pods Scheduled Successfully assigned nginx to 10.0.0.12 [root@master test]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 3m1.4 创建第二个pod
在master节点:
[root@master test]# cp k8s_pod.yml k8s_pod2.yml
[root@master test]# vim k8s_pod2.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx1
labels:
app: web1
spec:
containers:
- name: nginx1
image: 10.0.0.11:5000/lbz/nginx:v1
ports:
- containerPort: 80
~
~
"k8s_pod2.yml" 13L, 199C written
[root@master test]# kubectl create -f k8s_pod2.yml
pod "nginx1" created
[root@master test]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx 1/1 Running 0 8m 172.16.10.2 10.0.0.13
nginx1 1/1 Running 0 1m 172.16.49.2 10.0.0.12
1.5 更新镜像
在master节点: [root@master test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE 10.0.0.11:5000/lbz/nginx v1 2622e6cca7eb 2weeks ago 132.1 MB [root@master test]# docker tag 2622e6cca7eb 10.0.0.11:5000/lbz/nginx:v2 [root@master test]# docker push 10.0.0.11:5000/lbz/nginx:v2 用新镜像启动新容器代替原来的容器 [root@master test]# vim k8s_pod.yml image: 10.0.0.11:5000/lbz/nginx:v2 [root@master test]# kubectl replace --force -f k8s_pod.yml [root@master test]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 35s [root@master test]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx 1/1 Running 0 1m 172.16.10.2 10.0.0.132.RC应用
保证指定数量的pod始终存活,rc通过标签选择器来关联pod
1.rc部署 在节点master: [root@master ~]# kubectl delete pod nginx pod "nginx" deleted 配置yml文件 [root@master test]# pwd /opt/yml/test cat >k8s_nginx_rc.yml<3.depolyment资源管理: rc在滚动升级之后,会造成服务访问中断,于是k8s引入了deployment资源
1)通过控制RS来保证POD始终保持相应的数量副本
2)支持滚动更新,回滚,回滚默认保留10个版本
3)提供声明式配置,支持动态修改
4)管理无状态应用最理想的控制器1.depolyment资源管理 在master节点: vim k8s_nginx_dev.yml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: nginx spec: replicas: 4 template: metadata: labels: app: nginx spec: containers: - name: nginx image: 10.0.0.11:5000/lbz/nginx:v2 ports: - containerPort: 80 [root@master test]# kubectl create -f k8s_nginx_dev.yml [root@master test]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx 4 4 4 4 1m 2.deployment滚动升级 kubectl set image deployment/nginx nginx=10.0.0.11:5000/lbz/nginx:v1 当镜像出错时恢复到原来的状态: kubectl rollout undo deployment/nginx 3.HPA: 实现自动pod伸缩 [root@master test]# kubectl autoscale deployment nginx --min=2 --max=6 --cpu-percent=80 [root@master test]# kubectl get horizontalpodautoscalers NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE nginx Deployment/nginx 80%4.Service应用 4.1 Service部署2 6 1m kubectl get horizontalpodautoscalers kubectl edit horizontalpodautoscalers nginx 在线修改配置 提供负载均衡,使对外能够访问
1.创建svc配置文件 在master节点: vim k8s_nginx_svc.yml apiVersion: v1 kind: Service metadata: name: nginxsvc spec: type: NodePort ports: - port: 80 nodePort: 30001 selector: app: nginx [root@master test]# kubectl create -f k8s_nginx_svc.yml service "nginxsvc" created [root@master test]# kubectl get svc NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.254.0.14.2 Service验证443/TCP 6d nginxsvc 10.254.173.110 80:30001/TCP 46s [root@master test]# kubectl curl -r 10.0.0.13:30001 [root@master test]# kubectl curl -r 10.0.0.12:30001 在浏览器输入http://10.0.0.13:30001或者是http://10.0.0.12:30001



