kubernetes
简称k8s,它是一个全新的基于容器技术的分布式架构方案,它是谷歌十几年来大规模应用容器技术的经验累积和升华的一个重要成果。若是咱们的系统设计遵循了k8s的设计思想,那么传统系统架构中哪些和业务没有多大关系的底层代码或功能模块,均可以从咱们的实现中消失。咱们没必要费心与负载均衡的选型,没必要考虑引入或本身开发一个复杂的服务治理框架,没必要再头疼于服务监控和故障处理模块的开发,所以系统后期运维难度和运维成本难度大大下降。node
在k8s中,服务(Service)是核心,一个服务对象拥有以下关键特征:python
经过使用服务,咱们没必要担忧IP的变更性,由于服务一旦建立就再也不变化,另外咱们没必要关心后台有多少个服务进程,也没必要担忧这些进程因为服务故障而部署到其余机器,后台这些进程都是由相互独立的容器(默认使用的是docker)所支持。k8s所以提供了pod对象来包装这些容器,而pod运行在Node节点上,Node节点能够为一个物理机或者云端机器,虚拟机等。一样在集群管理上,k8s设计了Master节点和一群工做节点Node,而Master节点至关于k8s的首脑,咱们的全部操做都先要发给master,然后经过Master来调配各个节点的工做。linux
k8s具有如下特征:docker
根据资源需求和其余约束自动放置容器,同时不会牺牲可用性,混合关键和最大努力的工做负载,以提升资源利用率并节省更多资源。centos
从新启动失败的容器,在节点不可用时,替换和从新调度节点上的容器,对用户定义的健康检查不响应的容器会被停止,而且在容器准备好服务以前不会把其向客户端广播。api
使用简单的命令或 UI,或者根据 CPU 的使用状况自动调整应用程序副本数。tomcat
不须要修改您的应用程序来使用不熟悉的服务发现机制,Kubernetes 为容器提供了本身的 IP 地址和一组容器的单个 DNS 名称,并能够在它们之间进行负载均衡。安全
Kubernetes 逐渐部署对应用程序或其配置的更改,同时监视应用程序运行情况,以确保它不会同时终止全部实例。 若是出现问题,Kubernetes会为您恢复更改,利用日益增加的部署解决方案的生态系统。bash
部署和更新密钥和应用程序配置,不会从新编译您的镜像,不会在堆栈配置中暴露密钥(secrets)。网络
自动安装您所选择的存储系统,不管是本地存储,如公有云提供商 GCP 或 AWS, 仍是网络存储系统 NFS, iSCSI, Gluster, Ceph, Cinder, 或 Flocker。
除了服务以外,Kubernetes还能够管理您的批处理和 CI 工做负载,若是须要,替换出现故障的容器。
阿里云centos7.6 64位系统,经过安全组配置开放8080,2379,2378及30000-31000端口。首先咱们运行以下命令:
$ 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
运行如上命令为了解决以下问题,该问题最本质的表现为pod一值为ContainerCreating状态
FailedSynError syncing pod, skipping: failed to "StartContainer" for "POD" with ErrImagePull: "image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request. details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)" 13m 11s 56 {kubelet 127.0.0.1} Warning FailedSync Error syncing pod, skipping: failed to "StartContainer" for "POD" with ImagePullBackOff: "Back-off pulling image "registry.access.redhat.com/rhel7/pod-infrastructure:latest"
Error syncing pod, skipping: failed to "StartContainer" for "POD" with ErrImagePull: "image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request. details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)"
紧接着须要运行以下命令:
$ iptables -P FORWARD ACCEPT
这样解决了外网访问kube-proxy没法进行有效的转发问题
最简单的方式是经过yum来进行安装,命令以下:
$ yum install -y etcd kubernetes
安装好软件后,修改两个配置文件
# Modify these options if you want to change the way the docker daemon runs OPTIONS='--selinux-enabled=false --insecure-registry gcr.io --log-driver=journald --signature-verification=false'
—adminssion_control
参数中的ServiceAccount
删除# The address on the local server to listen to. KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
更改好后,咱们依次启动以下服务
$ systemctl start docker $ systemctl start etcd $ systemctl start kube-apiserver $ systemctl start kube-controller-manager $ systemctl start kube-scheduler $ systemctl start kubelet $ systemctl start kube-proxy
至此一个单机版的集群就构建完毕
接下来我构建一个最简单的tomcat应用为例,来带你们体验一下kubernetes的魔力。首先咱们能够在Idea环境里安装一个kubernetes的插件,这个插件可以友好的对配置文件进行提示。首先咱们建立一个tomcat-rc.yaml的配置文件,代码以下:
apiVersion: v1 kind: ReplicationController metadata: name: tomcat spec: replicas: 2 selector: app: tomcat template: metadata: labels: app: tomcat spec: containers: - name: tomcat image: tomcat ports: - containerPort: 8080
ReplicationController
(简称RC)是k8s的核心概念之一,简单来讲它定义了一个指望的场景,即声明某种Pod的副本数量在任意时刻都符合某个预期的值,因此RC的定义主要包含以下几个部分
接着咱们运行以下命令来建立RC:
$ kubectl create -f tomcat-rc.yaml
咱们能够经过以下命令来查看状态:
$ kubectl get rc
此时咱们能够看到咱们刚才建立的RC已经在运行了:
NAME DESIRED CURRENT READY AGE tomcat 2 2 2 31s
咱们能够运行:docker ps的命令来看看:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 960183da4c2b tomcat "catalina.sh run" 2 minutes ago Up 2 minutes k8s_tomcat_tomcat-mt8b5_default_14ff9d6d-2cdd-11e9-bd6b-025000000001_0 97c563415280 tomcat "catalina.sh run" 2 minutes ago Up 2 minutes k8s_tomcat_tomcat-kfmdj_default_14fe9e52-2cdd-11e9-bd6b-025000000001_0
颇有趣的状况咱们能够看到,当咱们建立RC时,k8s会建立对应副本数的docker容器,这也从侧面反映了经过k8s能屏蔽docker相关容器的建立操做,咱们只须要统一按照既定的排版规范就能编写咱们所需的容器
容器建立好了,其实咱们还有一位角色要粉墨登场,有了它的帮助。才叫一个合理的‘微服务’。其实k8s中service是一个很是很是核心的概念,它相似于代理门户,同时它屏蔽了pod与外界访问。咱们来看一下模板示例:
apiVersion: v1 kind: Service metadata: name: tomcat spec: type: NodePort ports: - port: 8080 protocol: tcp nodePort: 30001 selector: app: tomcat
而后运行以下命令建立服务:
$ kubectl create -f tomcat-svc.yaml
建立完毕后咱们能够运行以下命令来查看服务的状况
$ kubectl get svc
运行完毕会获得以下信息:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE tomcat 10.254.145.222 <nodes> 8080:30001/TCP 9d
紧接着咱们能够运行curl http://localhost:30001
便可得到对应的结果