第一章: 入门
大纲
基础概念: 核心术语,核心组件,架构(逻辑&物理)
集群部署以及陈述式命令管理接口
资源类型以及配置清单
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运行时的物理结构
生产环境至少要有三个master左右,worker需要三个以上。
Kubernetes Master的组成
APIServer: 声明式API,整个k8s请求的入口
Sheduler: 调度器,将任务调度到哪一个Node节点,Watch APIserver上的变动
Controller: 控制器,运行状态的获取,自动创建等问题,司令部;control Loop;确保Etcd中用户期望的状态和node节点当中的容器的状态一致
ETCD: 数据库(本身不属于k8s)
Kubernetes Node组成
kubelet: 也会watch APIServer上的变动,会使得Docker拉取镜像创建容器
CRI:容器运行时接口;CSI:容器存储接口;CNI:容器网络接口
kube-proxy
pod:容器的又一层外壳,容器运行的基本单位(其中的容器共享NETWORK,IPC,UTS)
Addons其他组件
DNS: 网络注册和解析
CNI: Flannel,calico 网络功能
WEBUI: Dashborad
Container Resource Mornitor:监控
Cluster-Level Logging: 审计
复习:
NameSpace六要素: PID,NETWORK,UTS,USER,Mount,IPC
jion网络模型依赖:NETWORK,IPC,UTS
小结
k8s的对象
对象式编程语言:
- 以数据为中心,代码服务于数据
- 数据: 对象
- 代码:方法
- class: 类,
- 属性,方法
基础对象:
POD:包含容器,其中的容器就是应用程序 ;PodIP
Service:反向代理,负载均衡;ServiceIP(ClusterIP);使用标签选择器来关联至后端的POD;简单来说就相当于是iptables或者ipvs规则,一般不会变
NameSpace
Volume
控制器对象: 控制POD的多退少补,健康状态等
ReplicaSet
Deploymnet: 最基础的控制器,指挥k8s创建POD,
DaemonSet
StatefulSet
Job
LNMT项目访问流程实例:
综上所述,K8S 的网络就分为如下
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的部署方式
部署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 #加入节点