一.k8s的由来及作用

1.传统架构分析

最传统的架构是所有的页面链接都是建立在一个域名之上,一旦主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 
Service   

1.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.13

1.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 docker

3.配置主节点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 name

4.配置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.service

5.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.service

6.验证节点状态

[root@master ~]# kubectl get nodes
NAME        STATUS    AGE
10.0.0.12   Ready     4m
10.0.0.13   Ready     4m

7.配置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" created

1.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          3m

1.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.13

2.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<<EOF
apiVersion: v1
kind: ReplicationController
metadata:
  name: nginxrc
spec:
  replicas: 3
  selector:
    app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: 10.0.0.11:5000/lbz/nginx:v2
        ports:
EOF
[root@master test]# kubectl create -f k8s_nginx_rc.yml
[root@master test]# kubectl get rc
NAME      DESIRED   CURRENT   READY     AGE
nginxrc   3         3         3         6s
[root@master test]#kubectl get pods -o wide
NAME            READY     STATUS    RESTARTS   AGE       IP            NODE
nginxrc-0rjnj   1/1       Running   0          19s       172.16.10.2   10.0.0.13
nginxrc-2rcxl   1/1       Running   0          19s       172.16.49.2   10.0.0.12
nginxrc-bn2z6   1/1       Running   0          19s       172.16.10.3   10.0.0.13

2.rc验证
模拟故障:删除掉一个会很快启动一个
[root@master test]#  kubectl delete pod nginxrc-0rjnj
又自动起了一个pod
[root@master test]# kubectl get pods -o wide
NAME            READY     STATUS    RESTARTS   AGE       IP            NODE
nginxrc-2rcxl   1/1       Running   0          2h        172.16.49.2   10.0.0.12
nginxrc-77hh6   1/1       Running   0          3s        172.16.49.3   10.0.0.12
nginxrc-bn2z6   1/1       Running   0          2h        172.16.10.3   10.0.0.13

3.rc副本数增删
1)修改配置文件
vim k8s_nginx_rc.yml
[root@master test]# kubectl replace -f k8s_nginx_rc.yml
2)kubectl edit rc nginxrc
3)kubectl scale rc nginxrc --replicas=4

4.滚动升级及回滚
cp k8s_nginx_rc.yml k8s_nginx_rc1.yml
kubectl rolling-update nginxrc -f k8s_nginx_rc1.yml --update-period=10s
语法:kubectl rolling-update OLDRCNAME -f NEWRCFILE --update-period=5s
回滚即是相反操作即可

注:
在升级过程中,可以进行回退。如果升级完成,则不可以使用这条指令进行回退。滚动升级中间出现了问题:
#kubectl rolling-update myapp-v1 -f my-app-v2-rc.yml --update-period=10 --rollback
语法:kubectl rolling-update OLDRCNAME NEWRCNAME --rollback

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%       <waiting>   2         6         1m

kubectl get horizontalpodautoscalers
kubectl edit horizontalpodautoscalers nginx   在线修改配置

4.Service应用

4.1 Service部署

提供负载均衡,使对外能够访问

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.1       <none>        443/TCP        6d
nginxsvc     10.254.173.110   <nodes>       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

4.2 Service验证

在浏览器输入http://10.0.0.13:30001或者是http://10.0.0.12:30001
在这里插入图片描述

Logo

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

更多推荐