Kubernetes,简称K8s,是一个开源的用于管理云平台中多个主机上的容器化的应用,它的目标是让部署容器化的应用简单并且高效(Powerful)。

https://kubernetes.io/zh/

相关概念

Master

集群控制节点,负责整个集群服务的的管理和控制,运行以下组件:

  • kube-apiserverhttp服务,对K8s中所有资源进行管理(增删改查),是集群控制入口
  • kubectl:是访问apiserver的客户端工具
  • kube-control-managerapiserver为对外开放的应用服务,与之相对的后台服务,负责K8s里所有资源对象的控制
  • kube-schedule:资源调度器,负责调度Pod到Node节点上
  • etcd:存储各种资源的状态数据

    Node

    除Master节点外的其他机器节点,是集群的工作负载节点,运行以下组件:
    kubelet:负责Pod对应的容器创建、启动、停止、资源监控等任务
    kube-proxy:实现Service的通信与负载均衡功能
    docker:容器 runtime

    Deployment

    当我们需要创建Pod来运行应用的时候,不是直接创建Pod,而是创建一个Deployment,用它负责创建和更新应用,可以理解为Pod的”管家”。

    Service

    因为K8s机制,Pod会不停的创建和销毁,其IP也会随之变化,想从外部固定访问Pod上运行的应用,就需要Service来暴露Pod里的应用,大致类似于Nginx的反向代理(不是很恰当)
    Service定义了一组Pod的逻辑集合和访问策略,无论Pod如何变化,只要Service的访问方式不变,K8s会通过服务注册/发现机制定位到相应的Pod应用

    Pod

    K8s里最小的逻辑运行单元,简单的说就是容器集合;相同Pod里运行的多个容器,共享utsnetipc空间等
    详情可查看官方文档 - https://kubernetes.io/zh/docs/home/

    搭建集群

    在本地服务器上的Hyper-V创建了 3 台虚拟主机全部安装CentOS 7部署,初始化详见:
    Linux(CentOS 7)系统初始化

    安装 Kubernetes Master

    1.安装Kubernetes和etcd
    1. yum install -y kubernetes etcd
    2.编辑/etc/etcd/etcd.conf使etcd监听所有的 ip 地址,确保下列行没有注释,并修改为下面的值

    vi /etc/etcd/etcd.conf

  1. # [member]
  2. ETCD_NAME=default
  3. ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
  4. ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
  5. #[cluster]
  6. ETCD_ADVERTISE_CLIENT_URLS="http://localhost:2379"

3.编辑Kubernetes API server的配置文件,确保下列行没有被注释,并为下列的值

vi /etc/kubernetes/apiserver

  1. ###
  2. # kubernetes system config
  3. #
  4. # The following values are used to configure the kube-apiserver
  5. #
  6. # The address on the local server to listen to.
  7. KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
  8. # The port on the local server to listen on.
  9. KUBE_API_PORT="--port=8080"
  10. # Port minions listen on
  11. KUBELET_PORT="--kubelet_port=10250"
  12. # Comma separated list of nodes in the etcd cluster
  13. KUBE_ETCD_SERVERS="--etcd_servers=http://127.0.0.1:2379"
  14. # Address range to use for services
  15. KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
  16. # default admission control policies
  17. KUBE_ADMISSION_CONTROL="--admission_control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
  18. # Add your own!
  19. KUBE_API_ARGS=""

4.启动etcdkube-apiserverkube-controller-managerkube-scheduler服务,并设置开机自启

  1. for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler; do
  2. systemctl restart $SERVICES
  3. systemctl enable $SERVICES
  4. systemctl status $SERVICES
  5. done

5.在etcd中定义flannel network的配置,这些配置会被flannel service下发到Node:

  1. etcdctl mk /coreos.com/network/config '{"Network":"172.17.0.0/16"}'

6.添加iptables规则,允许相应的端口

  1. iptables -I INPUT -p tcp --dport 2379 -j ACCEPT
  2. iptables -I INPUT -p tcp --dport 10250 -j ACCEPT
  3. iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
  4. iptables-save

7.查看节点信息(我们还没有配置节点信息,所以这里应该为空)

  1. kubectl get nodes
  2. No resources found.

vi /etc/kubernetes/apiserver

  1. "KUBE_ADMISSION_CONTROL="--admission_control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
  2. #去掉 ServiceAccount,保存退出

重新启动kube-apiserver服务即可

  1. systemctl status -l kubelet
  2. systemctl restart kubelet

安装 Kubernetes Nodes

PS.下面步骤应该在Node上执行(可以添加很多的Node)
1.使用yum安装Kubernetes和flannel

  1. yum install -y flannel kubernetes

2.为flannel service配置etcd服务器
编辑/etc/sysconfig/flanneld文件中的下列行以连接到Master

vi /etc/sysconfig/flanneld

  1. FLANNEL_ETCD_ENDPOINTS="http://192.168.1.103:2379"#改为 etcd 服务器的 ip

3.编辑Kubernetes配置文件
编辑/etc/kubernetes/config中Kubernetes的默认配置,确保KUBE_MASTER的值是连接到Kubernetes master API server

vi /etc/kubernetes/config

  1. KUBE_MASTER="--master=http://192.168.1.103:8080"

4.编辑/etc/kubernetes/kubelet如下行:

vi /etc/kubernetes/kubelet

  1. KUBELET_ADDRESS="--address=0.0.0.0"
  2. KUBELET_PORT="--port=10250"
  3. KUBELET_HOSTNAME="--hostname_override=192.168.1.104"
  4. KUBELET_API_SERVER="--api_servers=http://192.168.1.103:8080"
  5. KUBELET_ARGS=""

5.启动kube-proxykubeletdockerflanneld services服务,并设置开机自启

  1. for SERVICES in kube-proxy kubelet docker flanneld; do
  2. systemctl restart $SERVICES
  3. systemctl enable $SERVICES
  4. systemctl status $SERVICES
  5. done

6.在每个Node节点,你应当注意到你有两块新的网卡docker0flannel0。你应该得到不同的 ip 地址范围在flannel0上,就像下面这样:

  1. node1:
  2. ip a | grep flannel | grep inet
  3. inet 172.17.29.0/16 scope global flannel0

7.添加iptables规则:

  1. iptables -I INPUT -p tcp --dport 2379 -j ACCEPT
  2. iptables -I INPUT -p tcp --dport 10250 -j ACCEPT
  3. iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
  4. iptables-save

8.现在登陆KubernetesMaster节点验证Node的节点状态:

  1. kubectl get nodes
  2. NAME STATUS AGE
  3. 127.0.0.1 Ready 20m
  4. 192.168.1.104 Ready 4s

在每个节点上操作好上述步骤后,Kubernetes集群就已经配置并成功运行了,可以继续下面的步骤

👍 公有云集群

各种折腾后(前)公司决定直接花钱上阿里云 ACK 服务 ,搭建简单,去机房维护。

配置集群

Pods (Containers)

为了创建一个Pod,我们需要在KubernetesMaster上面定义一个 yaml 或者 json 配置文件。然后使用 kubectl 命令创建Pod

  1. mkdir -p k8s/pods
  2. cd k8s/pods/
  3. vi nginx.yaml
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: nginx
  5. labels:
  6. app: nginx
  7. spec:
  8. containers:
  9. - name: nginx
  10. image: nginx
  11. ports:
  12. - containerPort: 80

创建 pod

kubectl create -f nginx.yaml

pod “nginx” created

查看 pod

kubectl get pod nginx

NAME READY STATUS RESTARTS AGE nginx 0/1 ContainerCreating 0 30s

kubectl describe pod nginx

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)”

检查发现:/etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt是一个软连接
解决方法:

  1. yum install -y *rhsm*
  2. #下载并安装 rpm 包
  3. wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
  4. 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

删除重新创建

  1. kubectl delete pod nginx
  2. kubectl create -f nginx.yaml
  3. get pod nginx -o wide
  4. kubectl get pods --all-namespaces

其他环境

Docker

Docker Desktop 可以直接部署一个单点的K8s环境,如下图:
Windows 开启 WSL 并使用 Docker
image.png