先来聊聊云原生

image.png

所谓云原生,它不是一个产品,而是一套技术体系和一套方法论,而数字化转型是思想先行,从内到外的整体变革。更确切地说,它是一种文化,更是一种潮流,是云计算的一个必然导向。

云原生到底包含了哪些具体的技术呢?它包含了当前业界的一些热门的技术,比如容器、微服务、服务网格、Serverless、DevOps,API管理、不可变基础架构等。

在容器技术、可持续交付、编排系统等开源社区的推动下,以及微服务等开发理念的带动下,应用上云已经是不可逆转的趋势。随着云化技术的不断进展,云原生的概念也应运而生。

云原生概念的诞生

云原生(Cloud Native)的概念,由来自Pivotal的MattStine于2013年首次提出,被一直延续使用至今。这个概念是Matt Stine根据其多年的架构和咨询经验总结出来的一个思想集合,并得到了社区的不断完善,内容非常多,包括DevOps、持续交付(Continuous Delivery)、微服务(MicroServices)、敏捷基础设施(Agile Infrastructure)和12要素(The Twelve-Factor App)等几大主题,不但包括根据业务能力对公司进行文化、组织架构的重组与建设,也包括方法论与原则,还有具体的操作工具。采用基于云原生的技术和管理方法,可以更好地把业务生于“云”或迁移到云平台,从而享受“云”的高效和持续的服务能力。

云原生是面向“云”而设计的应用,因此技术部分依赖于传统云计算的3层概念,基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服务(SaaS)

云并非把原先在物理服务器上跑的东西放到虚拟机里跑,真正的云化不仅是基础设施和平台的事情,应用也要做出改变,改变传统的做法,实现云化的应用——应用的架构、应用的开发方式、应用部署和维护技术都要做出改变,真正的发挥云的弹性、动态调度、自动伸缩……一些传统IT所不具备的能力。这里说的“云化的应用”也就是“云原生应用”。云原生架构和云原生应用所涉及的技术很多,如容器技术、微服务、可持续交付、DevOps等。
image.png

而云原生应用最大的特点就是可以迅速部署新业务
CNCF(云原生计算基金会)认为云原生系统需包含的属性:
容器化封装:以容器为基础,提高整体开发水平,形成代码和组件重用,简化云原生应用程序的维护。在容器中运行应用程序和进程,并作为应用程序部署的独立单元,实现高水平资源隔离。

自动化管理:统一调度和管理中心,从根本上提高系统和资源利用率,同时降低运维成本。

面向微服务:通过松耦合方式,提升应用程序的整体敏捷性和可维护性。

正因为如此,你可以专注于创新,解决业务问题,而不是把时间花在“静态、不灵活的传统架构”存在的许多技术问题。
云原生的四要素:持续交付、DevOps、微服务、容器

在什么情况下需要微服务?我认为有三个标准:

.有HA(High Available)的需求需要微服务。
有性能调校的需求(例如:图片的呈现或者搜寻)需要微服务。
经常变更的需要微服务。
容器技术——使资源调度、微服务更容易

其实1979年就有容器技术,很多人会以为说Docker是不是等于容器,其实Docker不等于容器。容器的历史可追溯到Linux操作系统。容器利用了Linux的内核功能。Linux中容器的核心概念(cgroup、namespaces和filesystems)在独立的区域运行。容器的神奇之处在于将这些技术融为一体,以实现最大的便利性。


DevOps——以终为始,运维合一

关于云原生,我们需要关注六个:

Kubernetes核心概念

  • Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8S。
  • Kubernetes用于容器化应用程序的部署,扩展和管理,目标是让部署容器化应用简单高效。

    官方网站:http://www.kubernetes.io

    k8s是一个编排容器的工具,其实也是管理应用的全生命周期的一个工具,从创建应用,应用的部署,应用提供服务,扩容缩容应用,应用更新,都非常的方便,而且可以做到故障自愈,例如一个服务器挂了,可以自动将这个服务器上的服务调度到另外一个主机上进行运行,无需进行人工干涉。

那么,问题来了,要运维何用?

答: k8s可以更快的更新新版本,打包应用,更新的时候可以做到不用中断服务,服务器故障不用停机,从开发环境到测试环境到生产环境的迁移极其方便,一个配置文件搞定,一次生成image,到处运行。

在k8s进行管理应用的时候,基本步骤是:创建集群,部署应用,发布应用,扩展应用,更新应用。

比如扩容和缩容,:

在业务上线之后,碰到了双十一怎么办?扩容。万剑归宗,只要有一个pod,那么就可以产生无数个pod

而且扩容缩容,只需要一条命令即可 。

比如发布新版本,滚动更新

kubectl set image deployments/kel kel=nginx:1.8
Kubernetes 集群部署实战 - 图3
Kubernetes 集群部署实战 - 图4
Master角色

  • kube-apiserver

Kubernetes API,集群的统一入口,各组件协调者,以RESTful API提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd存储。

  • kube-controller-manager

处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的。

  • kube-scheduler

根据调度算法为新创建的Pod选择一个Node节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上。

  • etcd

分布式键值存储系统。用于保存集群状态数据,比如Pod、Service等对象信息。
Worker Node角色

  • kubelet

kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器。

  • kube-proxy

在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。

  • docker或rocket

容器引擎,运行容器。

14-2 Kubernetes基本概念

Pod

  • 最小部署单元
  • 一组容器的集合
  • 一个Pod中的容器共享网络命名空间
  • Pod是短暂的

Controllers

  • Deployment : 无状态应用部署
  • StatefulSet : 有状态应用部署
  • DaemonSet : 确保所有Node运行同一个Pod
  • Job : 一次性任务
  • Cronjob : 定时任务

控制器是更高级层次对象,用于部署和管理Pod。
Service

  • 防止Pod失联
  • 定义一组Pod的访问策略

Label : 标签,附加到某个资源上,用于关联对象、查询和筛选
Namespaces : 命名空间,将对象逻辑上隔离

14-3:快速部署一个Kubernetes集群

kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。
这个工具能通过两条指令完成一个kubernetes集群的部署:
# 创建一个 Master 节点
$ kubeadm init

将一个 Node 节点加入到当前集群中
$ kubeadm join

14-3-1 安装要求

在开始之前,部署Kubernetes集群机器需要满足以下几个条件:

硬件方面:

  1. 一台或者多台服务器,操作系统 centos7 系统
  2. 内存:>2G 4G
  3. 硬盘:30G
  4. cpu核心:2G

image.png

软件层面:

  1. 关闭防火墙
  2. 关闭selinux
  3. 关闭swap 空间
  4. 设置hostname
  5. 添加host
  6. 将桥接的IPv4流量传递到iptables的链
  7. 时间同步

注:
1.swap相当于“虚拟内存”。当物理内存不足时,拿出部分硬盘空间当SWAP分区(虚拟成内存)使用,从而解决内存容量不足的情况。
2.kubelet 在 1.8 版本以后强制要求 swap 必须关闭
3.free -m 命令可以查看交换区的空间大小,我们注释完再使用这个命令发现交换区swap还没关闭,因为需要重启才生效

14-3.2 准备环境

Kubernetes 集群部署实战 - 图6

角色 IP
k8s-master 192.168.3.71
k8s-node1 192.168.3.72
k8s-node2 192.168.3.73
  1. 关闭防火墙:
  2. $ systemctl stop firewalld
  3. $ systemctl disable firewalld
  4. 关闭selinux
  5. $ sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
  6. $ setenforce 0 # 临时
  7. 注:
  8. 1.selinux这个是用来加强安全性的一个组件,挺复杂的,一般直接禁用
  9. 2.关闭selinux以允许容器访问宿主机的文件系统
  10. [root@k8s-master ~]# grep disabled /etc/selinux/config |grep -v ^#
  11. 关闭swap
  12. $ swapoff -a # 临时
  13. $ vim /etc/fstab # 永久
  14. 设置主机名:
  15. $ hostnamectl set-hostname k8s-node2
  16. master添加hosts
  17. $ cat >> /etc/hosts << EOF
  18. 192.168.3.71 k8s-master
  19. 192.168.3.72 k8s-node1
  20. EOF
  21. 将桥接的IPv4流量传递到iptables的链:
  22. $ cat > /etc/sysctl.d/k8s.conf << EOF
  23. net.bridge.bridge-nf-call-ip6tables = 1
  24. net.bridge.bridge-nf-call-iptables = 1
  25. EOF
  26. $ sysctl --system # 生效
  27. 时间同步:
  28. $ yum install ntpdate -y
  29. $ ntpdate time.windows.com

14.3.3所有节点安装Docker/kubeadm/kubelet

Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker。
1、 安装Docker

  1. $ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
  2. $ yum -y install docker-ce-18.06.1.ce-3.el7
  3. $ systemctl enable docker && systemctl start docker
  4. $ docker --version
  5. Docker version 18.06.1-ce, build e68fc7a
  6. # cat > /etc/docker/daemon.json << EOF
  7. {
  8. "registry-mirrors": ["https://ywrd8tun.mirror.aliyuncs.com"]
  9. }
  10. EOF

2、 添加阿里云YUM软件源

  1. $ cat > /etc/yum.repos.d/kubernetes.repo << EOF
  2. [kubernetes]
  3. name=Kubernetes
  4. baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
  5. enabled=1
  6. gpgcheck=0
  7. repo_gpgcheck=0
  8. gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  9. EOF

3、 安装kubeadm,kubelet和kubectl

  1. yum install -y kubelet-1.17.0 kubeadm-1.17.0 kubectl-1.17.0
  2. systemctl enable kubelet

查看是否安装

  1. yum list installed | grep kubelet
  2. yum list installed | grep kubeadm
  3. yum list installed | grep kubectl

14.3.4 部署Kubernetes Master

在192.168.3.71(Master)执行。

  1. kubeadm init \
  2. --apiserver-advertise-address=192.168.3.71 \
  3. --image-repository registry.aliyuncs.com/google_containers \
  4. --kubernetes-version v1.17.0 \
  5. --service-cidr=10.96.0.0/12 \
  6. --pod-network-cidr=10.244.0.0/16

由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。
使用kubectl工具: (执行完查看nodes)

  1. mkdir -p $HOME/.kube
  2. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  3. sudo chown $(id -u):$(id -g) $HOME/.kube/config
  4. $ kubectl get nodes

14.3.5安装Pod网络插件(CNI)

  1. $ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

确保能够访问到quay.io这个registery。

如果Pod镜像下载失败,直接用xshell上传: E:\同步空间\公开课软件\k8s-to

image.png
kube-flannel.yml
执行完后稍等一分钟: 再次执行:
kubectl get nodes

14.3.6加入Kubernetes Node

在192.168.1.72/73(Node)执行。
向集群添加新节点,执行在kubeadm init输出的kubeadm join命令:

  1. $ kubeadm join 192.168.3.71:6443 --token esce21.q6hetwm8si29qxwn \
  2. --discovery-token-ca-cert-hash sha256:00603a05805807501d7181c3d60b478788408cfe6cedefedb1f97569708be9c5

默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,操作如下:

kubeadm token create
# kubeadm token list
# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed ‘s/^.* //‘
63bca849e0e01691ae14eab449570284f0c3ddeea590f8da988c07fe2729e924

kubeadm join 192.168.3.71:6443 —token nuja6n.o3jrhsffiqs9swnu —discovery-token-ca-cert-hash sha256:63bca849e0e01691ae14eab449570284f0c3ddeea590f8da988c07fe2729e924
kubeadm token create —print-join-command
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-join/

14.37 测试kubernetes集群

在Kubernetes集群中创建一个pod,验证是否正常运行:

  1. # 创建deploy
  2. $ kubectl create deployment nginx --image=nginx
  3. @ 开放端口
  4. $ kubectl expose deployment nginx --port=80 --type=NodePort
  5. $ kubectl get pod,svc
  6. # kubectl get service

访问地址:http://NodeIP:Port

image.png

15. 部署 Dashboard

  1. # 下载yaml
  2. [root@k8s-master01 ~]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
  3. # 修改kubernetes-dashboard的Service类型
  4. kind: Service
  5. apiVersion: v1
  6. metadata:
  7. labels:
  8. k8s-app: kubernetes-dashboard
  9. name: kubernetes-dashboard
  10. namespace: kubernetes-dashboard
  11. spec:
  12. type: NodePort # 新增
  13. ports:
  14. - port: 443
  15. targetPort: 8443
  16. nodePort: 30009 # 新增
  17. selector:
  18. k8s-app: kubernetes-dashboard
  19. # 部署
  20. [root@k8s-master01 ~]# kubectl create -f recommended.yaml
  21. # 查看namespace下的kubernetes-dashboard下的资源
  22. [root@k8s-master01 ~]# kubectl get pod,svc -n kubernetes-dashboard
  23. NAME READY STATUS RESTARTS AGE
  24. pod/dashboard-metrics-scraper-c79c65bb7-zwfvw 1/1 Running 0 111s
  25. pod/kubernetes-dashboard-56484d4c5-z95z5 1/1 Running 0 111s
  26. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  27. service/dashboard-metrics-scraper ClusterIP 10.96.89.218 <none> 8000/TCP 111s
  28. service/kubernetes-dashboard NodePort 10.104.178.171 <none> 443:30009/TCP 111s

如果地址不行,访问不了,用下面的地址

  1. kubectl apply -f http://mirror.faasx.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
  2. //结果
  3. secret/kubernetes-dashboard-certs created
  4. serviceaccount/kubernetes-dashboard created
  5. role.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created
  6. rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created
  7. deployment.apps/kubernetes-dashboard created
  8. service/kubernetes-dashboard created

创建访问账户,获取token

  1. # 创建账号
  2. [root@k8s-master01-1 ~]# kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
  3. # 授权
  4. [root@k8s-master01-1 ~]# kubectl create clusterrolebinding dashboard-admin-rb --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
  5. # 获取账号token
  6. [root@k8s-master01 ~]# kubectl get secrets -n kubernetes-dashboard | grep dashboard-admin
  7. dashboard-admin-token-xbqhh kubernetes.io/service-account-token 3 2m35s
  8. [root@k8s-master01 ~]# kubectl describe secrets dashboard-admin-token-xbqhh -n kubernetes-dashboard
  9. Name: dashboard-admin-token-xbqhh
  10. Namespace: kubernetes-dashboard
  11. Labels: <none>
  12. Annotations: kubernetes.io/service-account.name: dashboard-admin
  13. kubernetes.io/service-account.uid: 95d84d80-be7a-4d10-a2e0-68f90222d039
  14. Type: kubernetes.io/service-account-token
  15. Data
  16. ====
  17. namespace: 20 bytes
  18. token: eyJhbGciOiJSUzI1NiIsImtpZCI6ImJrYkF4bW5XcDhWcmNGUGJtek5NODFuSXl1aWptMmU2M3o4LTY5a2FKS2cifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4teGJxaGgiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiOTVkODRkODAtYmU3YS00ZDEwLWEyZTAtNjhmOTAyMjJkMDM5Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.NAl7e8ZfWWdDoPxkqzJzTB46sK9E8iuJYnUI9vnBaY3Jts7T1g1msjsBnbxzQSYgAG--cV0WYxjndzJY_UWCwaGPrQrt_GunxmOK9AUnzURqm55GR2RXIZtjsWVP2EBatsDgHRmuUbQvTFOvdJB4x3nXcYLN2opAaMqg3rnU2rr-A8zCrIuX_eca12wIp_QiuP3SF-tzpdLpsyRfegTJZl6YnSGyaVkC9id-cxZRb307qdCfXPfCHR_2rt5FVfxARgg_C0e3eFHaaYQO7CitxsnIoIXpOFNAR8aUrmopJyODQIPqBWUehb7FhlU1DCduHnIIXVC_UICZ-MKYewBDLw
  19. ca.crt: 1025 bytes

通过浏览器访问Dashboard的UI,在登录页面上输入上面的token

访问地址:http://NodeIP:30009

image.png

出现下面的页面代表成功

image.png