Kubernetes技术介绍

白话容器(Docker)

容器VS虚拟机

虚拟机

  • 硬件虚拟化
  • 操作系统
  • 应用

容器

  • 共享操作系统
  • 应用

容器本质: 一组资源被限制和隔离的进程

限制与隔离

Linux限制技术

  • Linux Cgroup

Linux Cgroups 的全称是 Linux Control Group。它最主要的作用,就是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。

Linux隔离技术

  • PID Namespace
  • Mount Namespace
  • Net Namespace
  • IPC Namespace
  • User Namespace
  • UTS Namespace

Namespace 技术实际上修改了应用进程看待整个计算机“视图”,即它的“视线”被操作系统做了限制,只能“看到”某些指定的内容。

容器 Tech Demo

#define _GNU_SOURCE
#include <fcntl.h>
#include <sched.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
    int pid_ns_fd;
    int net_ns_fd;
    int mnt_ns_fd;

    pid_ns_fd = open(argv[1], O_RDONLY);
    net_ns_fd = open(argv[2], O_RDONLY);
    mnt_ns_fd = open(argv[3], O_RDONLY);
    //printf("%s %s %s", argv[1], argv[2], argv[3]);

    // 设置pid namespace
    if (setns(pid_ns_fd, CLONE_NEWPID) < 0)
    {
        printf("set pid namespace error");
        return -1;
    }
    // 设置network namespace
    if (setns(net_ns_fd, CLONE_NEWNET) < 0)
    {
        printf("set ns namespace error");
        return -1;
    }
    // 设置mount namespace
    if (setns(mnt_ns_fd, CLONE_NEWNS) < 0)
    {
        printf("set ns namespace error");
        return -1;
    }
    // 执行命令
    pid_t pid = fork();
    if (pid < 0)
    {
        printf("fork error");
        return -1;
    }
    else if (pid == 0)
    {
        return execvp(argv[4], &argv[4]);
    }
    else
    {
        return waitpid(pid, NULL, 0);
    }
}
sudo ./setns /proc/11773/ns/pid /proc/11773/ns/net /proc/11773/ns/mnt bash

容器网络 overview

容器网络 veth pair

veth-pair 就是一对的虚拟设备接口,它都是成对出现的。一端连着协议栈,一端彼此相连着。

容器网络实践

  • 单机容器网络连通

容器到容器:通过docker0,直接互通
容器到宿主机/宿主机到容器:本地路由

  • 跨节点容器网络连通

一个简单不自动化方案:设置节点容器网段,在节点上配置路由

白话Kubernetes

  • Kubernetes架构
  • Kubernetes资源概念和使用
  • Kubernetes扩展

Kubernetes架构

Kubernetes资源概念和使用

资源类型

  • Nodes
  • Pods
  • Namespaces
  • Depolyments
  • Daemon Sets
  • Jobs
  • ConfigMaps
  • Secrets
  • ServiceAccounts
  • Services
  • more…

管理方式

kubectl (create|get|apply|delete) -f myResource.yaml

Kubernetes扩展

  • CRD
  • Operator模式

Kubernetes实践

Kubernetes部署

资源准备

  • Etcd
  • 机器

节点要求

  • 机器配置
  • 容器运行时
  • 内核参数
  • 网络设置

复杂点

  • 组件证书!!!
  • 组件参数

高可用

  • Etcd高可用
  • Master节点(Control plane)高可用

Kubernetes部署实践

Etcd

  • 动态平台etcd服务

master节点

  • kube-api-server
  • kube-controller-manager
  • kube-scheduler

node节点

  • kubelet
  • kube-proxy

Ansible demo

Kubernetes网络

Kubernetes网络约定

约定

  • Every pod gets its own IP address.
  • Containers within a pod share the pod IP address and can communicate freely with each other.
  • Pods can communicate with all other pods in the cluster using pod IP addresses (without NAT).
  • Isolation (restricting what each pod can communicate with) is defined using network policies.

网络实现和CNI(Container Network Interface)

Kubernetes组件中并没有实现约定的网络,而是制定了网络接口规范,将具体实现留给了插件。
简单来说,kubernetes组件中kubelet实现了cni插件接口,在创建Pod过程中调用插件,为Pod配置网络。

Kubernetes网络之overlay网络

Kubernetes网络约定思考

Kernernetes网络约定中"Pod到Pod的网络使用Pod IP无需Nat,即使跨节点",这定义了Cluster Pod网络是一个扁平的网络。
这样扁平的网络指什么呢?

Overlay

图中所示以vxlan实现举例基于四层(UDP),实现一个虚拟的二层网络。

Kubernetes网络插件之calico

回顾上文容器网络章节中,我们设计了一个方案“规划容器网段,配置路由”可实现容器跨节点网络,值得注意的是,这个简单方式所实现的网络是满足kubernetes的一个网络,容器之间通过IP互通,无需NAT。同时注意,这个网络No Overlay!。

calico

Calico主要由Felix、etcd、BGP client、BGP Route Reflector组成。

  • Etcd:负责存储网络信息
  • BGP client:负责将Felix配置的路由信息分发到其他节点
  • Felix:Calico Agent,每个节点都需要运行,主要负责配置路由、配置ACLs、报告状态
  • BGP Route Reflector:大规模部署时需要用到,作为BGP client的中心连接点,可以避免每个节点互联