kubernetes 环境搭建 及 基础架构介绍 及 一个进销存管理系统 简单搭建

kubernetes是一个全新的基于容器技术的分布式架构领先方案。它是谷歌十几年来大规模应用容器技术的经验积累和升华的一个重要成果

kubernetes是一个完备的分布式系统支撑平台。kubernetes具有完备的集群管理能力,包括多层次的安全防护和准入机制,多租户应用支撑能力,透明的服务注册和服务发现机制,内建智能负载均衡器,强大的故障发现和自我修复能力,服务滚动升级和在线扩容能力,可扩展的资源自动调度机制,以及多粒度资源配额管理能力。同时,kubernetes提供了完善的管理工具,这些工具涵盖了包括开发,部署测试,运维监控在内的各个环节。因此,kubernetes是一个全新的基于容器技术的分布式架构解决方案,并且是一个一站式的完备的分布式系统开发和支撑平台

kubernetes安装步骤

环境准备

master:192.168.255

slave :192.168.255

在 搭环境之前先关闭好 防火强 和 selinux

在master机器上

首先在master 用yum安装 kubernetes 与 etcd

yum -y install kubernetes 目前 是 kubernetes-node-1.5.2-0.7.git269f928.el7.x86_64

yum -y install etcd 目前是3.2

配置文件存放于/etc/kubernetes目录中,其中config 文件的内容为所有服务都需要的参数。与kube-apiserver相关的参数放置于apiserver中

修改 config文件

配置文件config 的内容包括: log设置,是否允许允许具有特权模式的docker容器及 master所在的地址等

vim /etc/kubernetes/config

KUBE_LOGTOSTDERR="--logtostderr=true"

# journal message level, 0 is debug
KUBE_LOG_LEVEL="--v=0"

# Should this cluster be allowed to run privileged docker containers
KUBE_ALLOW_PRIV="--allow-privileged=false"

# How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="--master=http://192.168.255.128:8080"

修改配置文件apiserver

配置文件apiserver的内容包括:绑定主机的IP地址,端口号,etcd服务地址,Service所需的cluster ip池,一系列admission控制策略等

vim /etc/kubernetes/apiserver

KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_API_PORT="--insecure-port=8080"
# The port on the local server to listen on.
# KUBE_API_PORT="--port=8080"

# Port minions listen on
# KUBELET_PORT="--kubelet-port=10250"

# Comma separated list of nodes in the etcd cluster
KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379"

# Address range to use for services
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"

# default admission control policies
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"

# Add your own!
KUBE_API_ARGS=""

在slave机器上

修改slave 配置 文件kubelet

配置 文件kubelet 的内容包括:绑定主机IP地址,端口号,apiserver的地址等等

vim /etc/kubernetes/kubelet

KUBELET_ADDRESS="--address=0.0.0.0"

# The port for the info server to serve on
KUBELET_PORT="--port=10250"

# You may leave this blank to use the actual hostname
KUBELET_HOSTNAME="--hostname-override=linux-node2"

# location of the api-server
KUBELET_API_SERVER="--api-servers=http://192.168.255.128:8080"

# pod infrastructure container
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"

# Add your own!
KUBELET_ARGS=""

修改 config 配置文件

vim /etc/kubernetes/config

KUBE_LOGTOSTDERR="--logtostderr=true"

# journal message level, 0 is debug
KUBE_LOG_LEVEL="--v=0"

# Should this cluster be allowed to run privileged docker containers
KUBE_ALLOW_PRIV="--allow-privileged=false"

# How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="--master=http://192.168.255.128:8080"

然后在master 启动 etcd , kube-apiserver.service kube-controller-manager.service kube-scheduler.service 服务

[root@linux-node1 log]# systemctl start etcd

[root@linux-node1 log]# systemctl start kube-apiserver.service

[root@linux-node1 ~]# systemctl start kube-controller-manager.service

[root@linux-node1 ~]# systemctl start kube-scheduler.service

在slave 启动 kubelet, kube-proxy 服务

systemctl start kubelet

systemctl start kube-proxy

启动完毕后 在 mater 上执行 kubectl get nodes 如果状态显示 Ready 就说明配置成功

NAME STATUS AGE

127.0.0.1 NotReady 25m

linux-node2 Ready 32s

如果 有错误,可以查看 /var/log/message

kubernets 基础架构

kubernets集群分为两类节点,分别是Master和Node, 在master运行 etcd,kube-apiserver,kube-controller-manager,kube-scheduler服务,其中

etcd 是一个key,value数据库,用于持久化集群中所有资源对象,如Service,RC等,apiserver提供了操作etcd的封装接口API,以REST接口提供服务

这些服务基本上都是集群中资源对象的CURD及监听资源变化的接口,比如创建Pod,创建RC,监听Pod的变化等,其中master 的 apiserver,controller-manager

,kube-scheduler 三个组件构成了kubernetes的总控制中心,负责对集群中所有资源进行管控和调度

在每个Node上运行Kubelet,Proxy和Docker Daemon三个组件,负责对本节点上的Pod的生命周期进行管理,以及实现服务代理的功能,Kubelet是命令行的

工具,它提供了kubernetes的集群管理工具集

其中 controller-manager:集群内部的管理控制中心,其主要目的是实现kubernetes集群的故障检测和恢复的自动化工作,比如根据RC的定义完成pod的复制或移除,确保pod的数量与RC定义的数量相符,维护 服务 的 endpoints创建与删除。node的自动发现,管理,状态的监控等都是controller-manager的工作

kube-scheduler:在集群中,负责pod节点的任务调度

proxy: service 与 pod间的代理,实现 service 与 pod间的软件负载均衡

kubernetes 的 简单使用

使用 kubernetes 运行一个 基于 spring boot 的 进销存管理系统,关于进销存镜像的制作,请查看我前面docker的文章

我们先定义RC来创建Pod,然后定义与之关联的Service

首先创建要 RC

vim jxc.yaml

apiVersion: v1
kind: ReplicationController
metadata:
  name: jxc
  labels:
    name: jxc
spec:
  replicas: 1
  selector:
    name: jxc
  template:
    metadata:
      labels:
        name: jxc
    spec:
      containers:
      - name: jxc
        image: 192.168.255.128:5000/jxc:0.0.3
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080

kind字段的值为“ReplicationController”,表示这是一个RC。

spec.selector是RC的pod选择器,即RC只监控和管理拥有这些标签(Label)的pod实例

replicas=1 表示只能运行一个 名为jxc的 pod实例,当集群中运行的pod数量小于replicas时,RC会根据spec.template

段定义的pod模板来生成一个新的pod实例

创建好yaml 文件以后,我们在master节点执行命令 kubectl create -f jxc.yaml,将它发布到kubernetes集群中

kubectl get rc 查看 集群 运行的 rc

kubectl get pod 查看当前集群中的pod列表信息

然后创建一个与之关联的Service 资源服务

vim jxc-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: jxc
  labels:
    name: jxc
spec:
  type: NodePort
  ports:
  - port: 80
    nodePort: 30001
  selector:
    name: jxc

其中 metadata.name 是 service的服务名

spec.selector确定了哪些pod对应到本服务

type=NodePort并指定一个NodePort的值,表示使用Node上的物理机端口提供对外访问的能力。spec.ports.NodePort

的端口号定义有范围限制,默认为30000-32767,如果配置为范围外的其他端口号,则创建Service将会失败

kubectl create -f jxc-service.yaml,将它发布到kubernetes

我们可以通过 kubectl get services 查看 新增的 services是否创建成功

kubectl describe pods Pod_Name 查看pod详细信息

kubectl describe rc jxc 查看rc详细信息

删除 指定文件的所创建的资源

kubectl delete -f jxc.yaml

错误排错

我们在 运行的

1 Error creating: No API token found for service account "default", retry after the token is automatically created and added to the service account

解决办法:

修改apiserver文件

vim /etc/kubernetes/apiserver

#KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"

KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"

2 image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be becaus

解决办法

yum install *rhsm*

3 Trying to pull repository registry.access.redhat.com/rhel7/pod-infrastructure ...

open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory

解决办法:

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

排查错误手段

docker logs -f a5778e9ab8d4 查看docker 容器日志进行排错

kubectl describe rc jxc 查看rc详细信息

docker logs -f -t --tail 10 s12 实时查看docker容器名为s12的最后10行日志

这样就可以访问服务了

猜你喜欢

转载自blog.csdn.net/weixin_39639119/article/details/83241205