第一章: 入门&测试环境部署

第一章: 入门

大纲

  • 基础概念: 核心术语,核心组件,架构(逻辑&物理)

  • 集群部署以及陈述式命令管理接口

  • 资源类型以及配置清单

  • POD资源

  • POD控制器

  • Service资源

  • 存储卷

  • ConfigMap&Secret资源

  • StatefulSet控制器

  • 认证,授权以及准入机制

  • 网络模型以及网络策略

  • POD资源调度

  • CRD,自定义资源,自定义控制机器以及自定义APIserver

  • 资源监控与HPA控制器

  • Helm管理器

  • 高可用Kubernetes

github地址:https://github.com/kubernetes/kubernetes/

背景知识

微服务 VS 单体应用程序
服务注册&服务发现&服务总线

服务编排自动编排

容器编排

  • Docker通过镜像解决了程序打包的根本性难题,推动了容器技术的快速普及和生产落地

  • 容器本身仅提供了运行应用的底层逻辑,而容器编排才是真正产生价值的位置所在

提供的功能和特点

  • 提供了容器生命周期管理的工具,尤其在大规模服务,动态注册等环境中

  • 完成以下任务的自动化:

    • 容器的提供和部署

    • 冗余以及可用性: 自动修复

    • 按需完成规模的动态扩缩容

    • 故障自动迁移

    • 容器之间的资源分配

    • 暴露资源到外部访问

    • 负载均衡,健康状态检测,服务注册以及发现

容器编排系统

  • Kubernetes: CNCF

  • DockerSwarm

  • Apache Mesos and Marathon

Kubernetes运行时的物理结构

image.png

生产环境至少要有三个master左右,worker需要三个以上。

image.png

Kubernetes Master的组成

  • APIServer: 声明式API,整个k8s请求的入口

  • Sheduler: 调度器,将任务调度到哪一个Node节点,Watch APIserver上的变动

  • Controller: 控制器,运行状态的获取,自动创建等问题,司令部;control Loop;确保Etcd中用户期望的状态和node节点当中的容器的状态一致

  • ETCD: 数据库(本身不属于k8s)

image.png

Kubernetes Node组成

  • kubelet: 也会watch APIServer上的变动,会使得Docker拉取镜像创建容器

  • CRI:容器运行时接口;CSI:容器存储接口;CNI:容器网络接口

  • kube-proxy

  • pod:容器的又一层外壳,容器运行的基本单位(其中的容器共享NETWORK,IPC,UTS)

image.png

Addons其他组件

  • DNS: 网络注册和解析

  • CNI: Flannel,calico 网络功能

  • WEBUI: Dashborad

  • Container Resource Mornitor:监控

  • Cluster-Level Logging: 审计

复习:
NameSpace六要素: PID,NETWORK,UTS,USER,Mount,IPC
jion网络模型依赖:NETWORK,IPC,UTS

小结

image.png

k8s的对象

对象式编程语言:
- 以数据为中心,代码服务于数据
- 数据: 对象
- 代码:方法
- class: 类,
- 属性,方法

基础对象:

  • POD:包含容器,其中的容器就是应用程序 ;PodIP

  • Service:反向代理,负载均衡;ServiceIP(ClusterIP);使用标签选择器来关联至后端的POD;简单来说就相当于是iptables或者ipvs规则,一般不会变

  • NameSpace

  • Volume

控制器对象: 控制POD的多退少补,健康状态等

  • ReplicaSet

  • Deploymnet: 最基础的控制器,指挥k8s创建POD,

  • DaemonSet

  • StatefulSet

  • Job

LNMT项目访问流程实例:

image.png

综上所述,K8S 的网络就分为如下

image.png
  • POD间跨NODE的访问需要借助于Service转发到其他Node的POD上

  • Service也就是一个PODIP的交换机或者DNS服务

K8S的部署

部署要点

  • 测试环境

    • 可以使用单Master节点,单ETCD实例

    • Node主机按需而定

    • nfs或者glusterfs等存储系统

  • 生产环境

    • 高可用ETCD集群,建立3,5,7个节点

    • 高可用Master

      • kube-apiserver无状态,可多实例

        • 借助于keepalived进行VIP漂移实现多实例冗余

        • 或在多实例前端通过Haproxy或者Nginx反代,并借助keepalived对代理服务进行冗余

      • kube-scheduler以及kube-controller-manager各自只能有一个活动实例,但可以有多个备用

        • 自带leader选举功能,默认处于启用状态
    • 多Node主机,冗余能力越强越好

    • Ceph,GlusterFS ,ISCSI等云存储

部署工具

常用的部署环境:

- IAAS公有云部署环境: aws,aliyun

- IAAS私有云或公有云环境: Openstack或者Vsphere

- Baremetal环境: 物理服务器或者独立的虚拟机等

常用的部署工具

- kubeadm

- kops

- kubespray

- kontena pharos

其他二次封装的常用发行版

- Rancener

- Tectonic

- Oenshift

k8s的部署方式

image.png

部署K8S集群

主机名 IP 角色 部署软件
centos7-node1 192.168.56.11 Master docker,kubeadm,kubelet,kubectl,etcd,kube-apiserver,kube-scheduler,kube-control-manager
centos7-node2 192.168.56.12 Node docker,kubeadm,kubelet,kubectl,pause,kube-proxy
centos7-node3 192.168.56.13 Node docker,kubeadm,kubelet,kubectl,pause,kube-proxy
centos7-node4 192.168.56.14 Node docker,kubeadm,kubelet,kubectl,pause,kube-proxy

系统初始化:

1. NTP时间服务器,确保时间同步


$ yum install chrony -y && systemctl enable chronyd && systemctl start chronyd

$ timedatectl set-timezone Asia/Shanghai && timedatectl set-ntp yes

2. 主机名解析


$  cat /etc/hosts

192.168.56.11 centos7-node1

192.168.56.12 centos7-node2

192.168.56.13 centos7-node3

192.168.56.14 centos7-node4

3. 关闭个节点的iptables& firewalld服务,selinux服务


$ cat /etc/selinux/config 

SELINUX=disabled

$ systemctl stop firewalld && systemctldisable firewalld

4. 禁用swap


$ sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab

$ swapoff -a

5. 各节点载入ipvs模块


$ vim /etc/sysconfig/modules/ipvs.modules

#!/bin/bash

ipvs_mods_dir="/usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs"

for mod in $(ls $ipvs_mods_dir | grep -o "^[^.]*"); do

    /sbin/modinfo -F filename $mod &> /dev/null

    if [ $? -eq 0 ]; then

        /sbin/modprobe $mod

    fi

done

修改文件权限,并手动为当前系统加载内核模块:

$ chmod +x /etc/sysconfig/modules/ipvs.modules  && bash /etc/sysconfig/modules/ipvs.modules  

6. yum仓库&基础软件安装


$ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker.repo

$ cat >  /etc/yum.repos.d/kubernetes.repo <

7. 系统参数


$ cat > /etc/sysctl.d/k8s.conf << EOF

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

net.ipv4.ip_forward = 1

EOF

$ sysctl -p /etc/sysctl.d/k8s.conf 

8. 安装docker&&Kubernetes

Master节点的安装


## Master节点

$ yum -y install docker-ce

$ mkdir -p /etc/docker

$ tee /etc/docker/daemon.json <<-'EOF'

{

  "registry-mirrors": ["https://0b8hhs68.mirror.aliyuncs.com"],

   "exec-opts": ["native.cgroupdriver=cgroupfs"]

}

EOF

$ systemctl daemon-reload && systemctl restart docker  && systemctl enable docker

# 拉取需要的镜像

$ docker pull mirrorgooglecontainers/kube-apiserver-amd64:v1.16.0

$ docker pull mirrorgooglecontainers/kube-controller-manager-amd64:v1.16.0

$ docker pull mirrorgooglecontainers/kube-scheduler-amd64:v1.16.0

$ docker pull mirrorgooglecontainers/kube-proxy-amd64:v1.16.0

$ docker pull mirrorgooglecontainers/etcd-amd64:3.3.15-0

$ docker pull mirrorgooglecontainers/pause:3.1

$ docker pull coredns/coredns:1.6.2

$ docker tag mirrorgooglecontainers/kube-apiserver-amd64:v1.16.0 k8s.gcr.io/kube-apiserver:v1.16.0

$ docker tag mirrorgooglecontainers/kube-controller-manager-amd64:v1.16.0 k8s.gcr.io/kube-controller-manager:v1.16.0

$ docker tag mirrorgooglecontainers/kube-scheduler-amd64:v1.16.0 k8s.gcr.io/kube-scheduler:v1.16.0

$ docker tag mirrorgooglecontainers/kube-proxy-amd64:v1.16.0 k8s.gcr.io/kube-proxy:v1.16.0

$ docker tag mirrorgooglecontainers/etcd-amd64:3.3.15-0 k8s.gcr.io/etcd:3.3.15-0

$ docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1

$ docker tag coredns/coredns:1.6.2 k8s.gcr.io/coredns:1.6.2

$ docker rmi mirrorgooglecontainers/kube-apiserver-amd64:v1.16.0

$ docker rmi mirrorgooglecontainers/kube-controller-manager-amd64:v1.16.0

$ docker rmi mirrorgooglecontainers/etcd-amd64:3.3.15-0

$ docker rmi mirrorgooglecontainers/kube-scheduler-amd64:v1.16.0

$ docker rmi mirrorgooglecontainers/kube-proxy-amd64:v1.16.0

$ docker rmi mirrorgooglecontainers/pause:3.1

$ docker rmi coredns/coredns:1.6.2

# 常规操作

$ yum -y install kubelet-1.16.0-0 kubeadm-1.16.0-0 kubectl-1.16.0-0

$ systemctl start kubelet && systemctl enable kubelet

$ kubeadm config print init-defaults > kubeadm.yaml

$ vim kubeadm.yaml

apiVersion: kubeadm.k8s.io/v1beta2

bootstrapTokens:

- groups:

  - system:bootstrappers:kubeadm:default-node-token

  token: abcdef.0123456789abcdef

  ttl: 24h0m0s

  usages:

  - signing

  - authentication

kind: InitConfiguration

localAPIEndpoint:

  advertiseAddress: 192.168.56.11 ##修改

kubernetesVersion: v1.16.0

networking:

  dnsDomain: cluster.local

  serviceSubnet: 10.96.0.0/12

scheduler: {}

networking:

  podSubnet: 10.244.0.0/16 #添加pod网络

$ kubeadm init --config kubeadm.yaml   #初始化

$ mkdir -p $HOME/.kube

$ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

$ chown $(id -u):$(id -g) $HOME/.kube/config

$ kubectl get cs

$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

$  kubectl get pods -n kube-system   #系统容器运行状态查看

$  kubectl get nodes

NAME STATUS ROLES AGE VERSION

centos7-node1 Ready master 7m8s v1.16.0

Node节点的安装


## Node节点

$ yum -y install docker-ce

$ mkdir -p /etc/docker

$ tee /etc/docker/daemon.json <<-'EOF'

{

  "registry-mirrors": ["https://0b8hhs68.mirror.aliyuncs.com"]

}

EOF

$ systemctl daemon-reload

$ systemctl restart docker

$ yum -y install kubelet-1.16.0-0 kubeadm-1.16.0-0

$ systemctl start kubelet && systemctl enable kubelet 

$ docker pull mirrorgooglecontainers/kube-proxy-amd64:v1.16.0

$ docker pull mirrorgooglecontainers/pause:3.1

$ docker tag mirrorgooglecontainers/kube-proxy-amd64:v1.16.0 k8s.gcr.io/kube-proxy:v1.16.0

$ docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1

$ docker rmi mirrorgooglecontainers/kube-proxy-amd64:v1.16.0

$ docker rmi mirrorgooglecontainers/pause:3.1

$  kubeadm join 192.168.56.11:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:85969e88263597649f29e75674694d4c0464e64b8e2505d10259ea986428db07    #加入节点

你可能感兴趣的:(第一章: 入门&测试环境部署)