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的中心连接点,可以避免每个节点互联