容器化进阶Kubernetes(K8S)详解

1.Kubernetes概述

1.1 Kubernetes介绍

1.1.1 Kubernetes是什么及作用

Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。

Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。

官网地址 Kubernetes

中文社区 Kubernetes(k8s)中文文档 目录_Kubernetes中文社区

Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes一个核心特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望运行。

以下是Kubernetes相关特性:

自动包装

根据资源需求和其他约束自动放置容器,同时不会牺牲可用性,混合关键和最大努力的工作负载,以提高资源利用率并节省更多资源。

横向缩放

使用简单的命令或 UI,或者根据 CPU 的使用情况自动调整应用程序副本数。

自动部署和回滚

Kubernetes 逐渐部署对应用程序或其配置的更改,同时监视应用程序运行状况,以确保它不会同时终止所有实例。 如果出现问题,Kubernetes会为您恢复更改,利用日益增长的部署解决方案的生态系统。

存储编排

自动安装您所选择的存储系统,无论是本地存储,如公有云提供商 GCP 或 AWS, 还是网络存储系统 NFS,iSCSI, Gluster, Ceph, Cinder, 或 Flocker。

自我修复

重新启动失败的容器,在节点不可用时,替换和重新编排节点上的容器,终止不对用户定义的健康检查做出响应的容器,并且不会在客户端准备投放之前将其通告给客户端。

服务发现和负载均衡

不需要修改您的应用程序来使用不熟悉的服务发现机制,Kubernetes 为容器提供了自己的 IP 地址和一组容器的单个 DNS 名称,并可以在它们之间进行负载均衡。

密钥和配置管理

部署和更新密钥和应用程序配置,不会重新编译您的镜像,不会在堆栈配置中暴露密钥(secrets)。

批处理

除了服务之外,Kubernetes还可以管理您的批处理和 CI 工作负载,如果需要,替换出现故障的容器。

使用Kubernetes能做什么

Kubernetes是一个全新的基于容器技术的分布式架构领先方案(源于Brog,是google十几年经验的结晶);

Kubernetes是一个开放的开发平台(无侵入性,现有系统很容器迁移到Kubernetes上);

Kubernetes是一个完备的分布式系统支撑平台(完善的集群管理能力)。

使用Kubernetes可以在物理或虚拟机的Kubernetes集群上运行容器化应用,Kubernetes能够提供一个以容器为中心的基础架构,满足在生产环境中运行应用的一些常见需求,如:

多个进程协同工作
存储系统挂载
Distributing secrets
应用健康检测
应用实例的复制
Pod自动伸缩/扩展
Naming and discovering
负载均衡
滚动更新
资源监控
日志访问
调度应用程序
提供认证和授权

为什么使用Kubernetes

使用Kubernetes最直接的感受就是我们可以轻装上阵的开发复杂的系统了;其次Kubernetes是在全面拥抱微服务架构(微服务的核心就是将一个巨大的单体应用拆分成很多小的互相连接的微服务,一个微服务后面可能是多个实例副本在支撑,副本数量可以随着系统负荷的变化而动态调整);最后Kubernetes系统架构具备超强的横向扩展能力。

1.1.2 Kubernetes快速入门

环境准备

  • 关闭CentOS防火墙

systemctl status firewalld.service    查看防火墙是否打开
​
systemctl stop firewalld.service      关闭防火墙
​
systemctl disable firewalld.service   永久关闭防火墙
  • 安装etcd和kubernetes软件

yum install -y etcd kubernetes
  • 启动服务

systemctl start etcd   ==》  systemctl status etcd(查看)
​
systemctl start docker ==》  systemctl status docker(查看)
如果docker启动失败,请参考(vi /etc/sysconfig/selinux 把selinux后面的改为disabled,重启机器(reboot -n),再重启docker、启动服务就可以了)
systemctl start kube-apiserver
​
systemctl start kube-controller-manager
​
systemctl start kube-scheduler
​
systemctl start kubelet
​
systemctl start kube-proxy

配置(在/usr/local/k8s目录下创建文件)

  • Tomcat配置

    创建 mytomcat.rc.yaml 文件

    apiVersion: v1
    kind: ReplicationController
    metadata:
     name: mytomcat
    spec:
     replicas: 2
     selector:
      app: mytomcat
     template:
      metadata:
       labels:
        app: mytomcat
      spec:
       containers:
        - name: mytomcat
          image: tomcat:7-jre7
          ports:
          - containerPort: 8080
    

创建 mytomcat.svc.yaml 文件

apiVersion: v1
kind: Service
metadata:
 name: mytomcat
spec:
 type: NodePort
 ports:
  - port: 8080
    nodePort: 30001
 selector:
  app: mytomcat

执行配置文件命令

kubectl create -f mytomcat.rc.yaml   ==》  kubectl get pods(查看)
​
kubectl create -f mytomcat.svc.yaml  ==》  kubectl get svc(查看)

问题解决

浏览器出不来tom猫解决办法

kubectl replace -f mytomcat.rc.yaml
​
kubectl delete svc
​
kubectl delete svc --all
​
kubectl create -f mytomcat.svc.yaml

docker pull失败

解决方案1 
​
1、yum install rhsm -y          yum install *rhsm*
​
2、docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
​
如果以上两步解决问题了,那么就不需要在执行下面操作
​
3、docker search pod-infrastructure 
​
4、docker pull docker.io/tianyebj/pod-infrastructure 
​
5、docker tag tianyebj/pod-infrastructure 192.168.1.83:5000/pod-infrastructure 
​
6、docker push 192.168.1.83:5000/pod-infrastructure 
​
7、vi /etc/kubernetes/kubelet
修改 KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=192.168.1.83:5000/pod-infrastructure:latest" 
​
8、重启服务
systemctl restart kube-apiserver 
systemctl restart kube-controller-manager 
systemctl restartkube-scheduler 
systemctl restart kubelet 
systemctl restart kube-proxy
解决方案2 
​
1、docker pull kubernetes/pause
​
2、docker tag docker.io/kubernetes/pause:latest 192.168.1.83:5000/google_containers/pause-amd64.3.0
​
3、docker push 192.168.1.83:5000/google_containers/pause-amd64.3.0
​
4、vi /etc/kubernetes/kubelet 
配置为 KUBELET_ARGS="--pod_infra_container_image=192.168.187.137:5000/google_containers/pause-amd64.3.0"
​
5、重启kubelet服务 systemctl restart kubelet


发现缺少/etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt

解决:
yum install *rhsm*

安装完成后,执行一下
docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest

如果依然报错,可参考下面的方案:
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem

systemctl restart docker   然后重启一下

kubectl describe pod pod名称   查看pod详情

kubectl logs -f pod名称    查看pod日志

外部网不能访问

在搭建好的k8s集群内创建的容器,只能在其所在的节点上curl可访问,但是在其他任何主机上无法访问容器占用的端口

解决方案:
1、vim /etc/sysctl.conf
​
2、最后面加上这一行:net.ipv4.ip_forward=1

解决 kubectl get pods 时No resources found

1、vim /etc/kubernetes/apiserver 
​
2、找到”KUBE_ADMISSION_CONTROL="-admission_control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota",去掉ServiceAccount,保存退出
​
3、systemctl restart kube-apiserver 重启此服务

浏览测试

1.2 Kubernetes基本架构与常用术语

Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, etc),一切都基于分布式的存储系统。下面这张图是Kubernetes的架构图。

 在这张系统架构图中,我们把服务分为运行在工作节点上的服务和组成集群级别控制板的服务。

Kubernetes节点有运行应用容器必备的服务,而这些都是受Master的控制。

每次个节点上当然都要运行Docker。Docker来负责所有具体的映像下载和容器运行。

Kubernetes主要由以下几个核心组件组成:

  • etcd 保存了整个集群的状态;

  • apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;

  • controller manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;

  • scheduler 负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;

  • kubelet 负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;

  • Container runtime 负责镜像管理以及Pod和容器的真正运行(CRI);

  • kube-proxy 负责为Service提供cluster内部的服务发现和负载均衡;

除了核心组件,还有一些推荐的Add-ons:

  • kube-dns 负责为整个集群提供DNS服务

  • Ingress Controller 为服务提供外网入口

  • Heapster 提供资源监控

  • Dashboard 提供GUI

  • Federation 提供跨可用区的集群

  • Fluentd-elasticsearch 提供集群日志采集、存储与查询

Kubernetes设计理念和功能其实就是一个类似Linux的分层架构

  • 核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境

  • 应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)

  • 管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略

  • 管理(RBAC、Quota、PSP、NetworkPolicy等)

  • 接口层:kubectl命令行工具、客户端SDK以及集群联邦

  • 生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴

           Kubernetes外部:日志、监控、配置管理、CI、CD、Workflflow、FaaS、OTS应用、ChatOps等

              Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等

1.2.1 Cluster

Cluster是计算、存储和网络资源的集合,Kubernetes利用这些资源运行各种基于容器的应用.

Kubernetes Cluster由Master和Node组成,节点上运行着若干Kubernetes服务

1.2.2 Master

Master主要职责是调度,即决定将应用放在哪运行。Master运行Linux系统,可以是物理机或虚拟机。 Master是Kubernetes Cluster的大脑,运行着的Daemon服务包括kube-apiserver、kube-scheduler、kuber-controller-manager、etcd和Pod网络

  • API Serer(kube-apiserver)

API Server 提供HTTP/HTTPS RESTful API,即Kubernetes API.是Kubernetes里所有资源的CRUD等操作的唯一入口,也是集群控制的入口进程

  • Scheduler(kube-scheduler)

Scheduler负责资源调度的里程,简单说,它决定将Pod放在哪个Node上运行

  • Controller Manager(kube-controller-manager)

所有资源对象的自动化控制中心。Controller Manager负责管理Cluster各种资源,保证资源处于预期的状态。Controller Manager有多种,如replication controller、endpoints controller、namespacecontroller、serviceaccounts controller等。

不同的controller管理不同的资源,如replication controller管理Deployment、StatefulSet、DaemonSet的生命周期,namespace controller管理Namespace资源

  • etcd

etcd负责保存Kubernetes Cluster的配置信息和各种资源的状态信息。当数据发生变化时,etcd会快速地通知Kubernetes相关组件

  • Pod网络

Pod要能够相互通信,Kubernetes Cluster必须部署Pod网络,flflannel是其中一个可选方案。

1.2.2 Node

除了Master,Kubernetes集群中的其它机器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值