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 即可获得对应的结果
来源: http://www.bubuko.com/infodetail-2949515.html