1.kubernetes简介
kubernetes
简称k8s,它是一个全新的基于容器技术的分布式架构方案,它是谷歌十几年来大规模应用容器技术的经验累积和升华的一个重要成果。如果我们的系统设计遵循了k8s的设计思想,那么传统系统架构中哪些和业务没有多大关系的底层代码或功能模块,都可以从我们的实现中消失。我们不必费心与负载均衡的选型,不必考虑引入或自己开发一个复杂的服务治理框架,不必再头疼于服务监控和故障处理模块的开发,因此系统后期运维难度和运维成本难度大大降低。
在k8s中,服务(Service)是核心,一个服务对象拥有如下关键特征:
- 拥有一个唯一指定的名字
- 拥有一个虚拟ip
- 能够提供某种远程服务能力
- 被映射到了提供这种服务能力的一组应用上
通过使用服务,我们不必担心IP的变动性,因为服务一旦创建就不再变化,另外我们不必关心后台有多少个服务进程,也不必担心这些进程由于服务故障而部署到其他机器,后台这些进程都是由相互独立的容器(默认使用的是docker)所支持。k8s因此提供了pod对象来包装这些容器,而pod运行在Node节点上,Node节点可以为一个物理机或者云端机器,虚拟机等。同样在集群管理上,k8s设计了Master节点和一群工作节点Node,而Master节点相当于k8s的首脑,我们的所有操作都先要发给master,而后通过Master来调配各个节点的工作。
k8s具备以下特征:
- 自动包装
根据资源需求和其他约束自动放置容器,同时不会牺牲可用性,混合关键和最大努力的工作负载,以提高资源利用率并节省更多资源。
- 自我修复
重新启动失败的容器,在节点不可用时,替换和重新调度节点上的容器,对用户定义的健康检查不响应的容器会被中止,并且在容器准备好服务之前不会把其向客户端广播。
- 横向缩放
使用简单的命令或 UI,或者根据 CPU 的使用情况自动调整应用程序副本数。
- 服务发现和负载均衡
不需要修改您的应用程序来使用不熟悉的服务发现机制,Kubernetes 为容器提供了自己的 IP 地址和一组容器的单个 DNS 名称,并可以在它们之间进行负载均衡。
- 自动部署和回滚
Kubernetes 逐渐部署对应用程序或其配置的更改,同时监视应用程序运行状况,以确保它不会同时终止所有实例。 如果出现问题,Kubernetes会为您恢复更改,利用日益增长的部署解决方案的生态系统。
- 密钥 和 配置管理
部署和更新密钥和应用程序配置,不会重新编译您的镜像,不会在堆栈配置中暴露密钥(secrets)。
- 存储编排
自动安装您所选择的存储系统,无论是本地存储,如公有云提供商 GCP 或 AWS, 还是网络存储系统 NFS, iSCSI, Gluster, Ceph, Cinder, 或 Flocker。
- 批处理
除了服务之外,Kubernetes还可以管理您的批处理和 CI 工作负载,如果需要,替换出现故障的容器。
2、安装步骤
2.1、环境准备
阿里云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无法进行有效的转发问题
2.2、 安装
最简单的方式是通过yum来进行安装,命令如下:
$ yum install -y etcd kubernetes
安装好软件后,修改两个配置文件
- Docker配置文件目录为/etc/sysconfig/docker,在这个文件中做如下修改
# 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'
- Kubernetes apiServer配置文件位置:/etc/kubernetes/apiserver
- 把
—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
至此一个单机版的集群就构建完毕
3、快速上手
3.1、创建RC
接下来我构建一个最简单的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的定义主要包含如下几个部分
- Pod期待的副本数
- 用于筛选目标的Label Selector
- 当Pod的副本数量小于预期值的时候,用于创建新pod的模板
接着我们运行如下命令来创建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相关容器的创建操作,我们只需要统一按照既定的排版规范就能编写我们所需的容器
3.2、创建Service
容器创建好了,其实我们还有一位角色要粉墨登场,有了它的帮助。才叫一个合理的‘微服务’。其实k8s中service是一个非常非常核心的概念,它类似于代理门户,同时它屏蔽了pod与外界访问。我们来看一下模板示例:
apiVersion: v1
kind: Service
metadata:
name: tomcat
spec:
type: NodePort
ports:
- port: 8080
protocol: tcp
nodePort: 30001
selector:
app: tomcat
- 默认情况下NodePort是外界访问k8s集群的一种方式,nodePort的值是外界访问的端口它会被映射到容器的8080端口上
- selector.app的作用是将我们的Service与后台运行的pod相关联
然后运行如下命令创建服务:
$ 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
即可获得对应的结果