官方网址
https://kubernetes.io/
https://kubernetes.io/zh/
中文社区
http://docs.kubernetes.org.cn/
希腊语:舵手、飞行员
来自于谷歌Borg
使用golang语言开发
简称为k8s
现归属于CNCF
kubernetes是具有中心节点的架构,也就是说有master管理节点
节点角色
简单叫法
Master
Node
master节点是集群管理中心,它的组件可以在集群内任意节点运行,但是为了方便管理所以会在一台主机上运行Master所有组件,并且不在此主机上运行用户容器
Master组件包括:
kube-scheduler
监视新创建没有分配到Node的Pod,为Pod选择一个Node
kube-apiserver
用于暴露kubernetes API,任何的资源请求/调用操作都是通过kubeapiserver提供的接口进行
ETCD
是kubernetes提供默认的存储系统,保存所有集群数据,使用时需要
为etcd数据提供备份计划
kube-controller-manager
运行管理控制器,它们是集群中处理常规任务的后台线程
控制器包括:
node节点用于运行以及维护Pod,提供kubernetes运行时环境
Node组件包括:
Add-ons是附件不是插件,插件是程序本身的一部分,附件不是程序本身
一部分.
有附件可以使用功能更丰富,没它并不影响实际使用,可以与主体程序很
好结合起来使用
pod(豌豆夹)是kubernetes调度的最小单元
pod中包含了运行的容器, 有两种主要使用方式:
用户pod运行在node节点上,master节点不运行用户pod
pod在集群内可以访问,不能在集群外直接访问, 集群外访问pod需要借助于service
此服务不是真正的服务, 此服务是iptables或ipvs中的规则
能够感知pod ip地址的变化(服务发现)
先创建pod,后创建service,创建service其实就是在iptables或ipvs中添
加一条规则
如果访问pod,直接访问service
label标签是一组绑定到K8s资源对象上的key/value键值对
label可以附加到各种资源对象上,如Node,Pod,Service,RC等
通过给指定的资源对象捆绑一个或多个不用的label来实现多维度的资源分组管理功能,以便于灵活,方便地进行资源分配,调度,配置,部署等管理工作。
是同一个资源对象上,key不能重复,必须唯一
比如: 我们在创建pod时对pod添加一个app=nginx键值对, 那么后期管理时可以通过app这个key找到对应的pod.
标签选择器
在众多带有标签的pod中,找出指定标签的pod
是kubernetes核心的分组机制,通过Label Selector客户端/用户能够识别
一组有共同特征或属性的资源对象。
应用场景:
调度器
提供资源调度功能,负责对每个Node节点资源监控及Pod运行资源适配共2轮调度,一为预选,二为优选,最终哪个Node节点运行容器取决于优选算法
像httpd,nginx这种运行静态页面为无状态的pod
像php,tomcat,mysql等这种有连接的为有状态的pod
有控制器的pod
无控制器的pod
使用kubernetes集群运行NMP或NMT
问题: 集群内部用户怎么访问?
问题: 集群外部用户如何访问?
问题: 云平台上运行kubernetes集群, 云平台外面的用户如何访问?
kubernetes对网络要求
网络分层
CNI
网络主要考虑以下两个方面:
网络插件选择
以上为集群内各服务间访问证书
1,获取源码包
2, 部署在各节点中
3, 启动服务
master
node
生成证书
了解其它部署方式:
minikube 单机简化安装
kubeasz 支持多主 参考: https://github.com/easzlab/kubeasz
1, 所有节点主机名及绑定
127.0.0.1 localhost localhost.localdomain localhost4
localhost4.localdomain4
::1 localhost localhost.localdomain localhost6
localhost6.localdomain6
192.168.122.1 daniel.cluster.com
192.168.122.11 master
192.168.122.12 node1
192.168.122.13 node2
2, 所有节点关闭selinux
3, 所有节点关闭firewalld,安装iptables服务,并保存为空规则
systemctl stop firewalld
# systemctl disable firewalld
# yum install iptables-services -y
# systemctl restart iptables
# systemctl enable iptables
# iptables -F
# iptables -F -t nat
# iptables -F -t mangle
# iptables -F -t raw
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
# service iptables save
iptables: Saving firewall rules to
/etc/sysconfig/iptables:[ OK ]
3, 所有节点时间同步
4, 所有节点准备yum源(在centos默认源的基础上再加上以下两个yum源)
# vim /etc/yum.repos.d/kubernetes.repo
[k8s]
name=k8s
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/ku
bernetes-el7-x86_64/
enabled=1
gpgcheck=0
# wget https://mirrors.aliyun.com/dockerce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/dockerce.repo
5, 所有节点关闭swap(kubernetes1.8开始不关闭swap无法启动)
# swapoff -a
打开fstab文件将swap那一行注释保存
# vim /etc/fstab
UUID=38182b36-9be4-45f8-9b3f-f9b3605fcdf0 /
xfs defaults 0 0
UUID=6b69e04f-4a85-4612-b1c0-24939fd84962 /boot
xfs defaults 0 0
#UUID=9ba6a188-d8e1-4983-9abe-ba4a29b1d138 swap
swap defaults 0 0
6, RHEL7和CentOS7有由于iptables被绕过而导致流量路由不正确的问题,需要所有节点做如下操作:
# cat > /etc/sysctl.d/k8s.conf <
net.ipv4.ip_forward = 1
vm.swappiness = 0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# sysctl -p /etc/sysctl.d/k8s.conf
# modprobe br_netfilter
# lsmod |grep br_netfilter
7, 所有节点设置kube-proxy开启ipvs的前置条件由于ipvs已经加入到了内核的主干,所以为kube-proxy开启ipvs的前提需要加载以下的内核模块
# cat > /etc/sysconfig/modules/ipvs.modules <
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack_ipv4
EOF
# chmod 755 /etc/sysconfig/modules/ipvs.modules
# sh /etc/sysconfig/modules/ipvs.modules
# lsmod |egrep 'ip_vs|nf_conntrack'
安装软件
1, 所有节点安装docker, 一定要注意docker版本,docker最新版本kubernetes不一定支持,下面就是使用最新19.03.01跑docker在集群始化时报的错.所以在这里我们使用18.09的版本
# yum list docker-ce.x86_64 --showduplicates | sort -r
# yum install docker-ce-18.09.8-3.el7 docker-ce-cli18.09.8-3.el7 --setopt=obsoletes=0 -y
# docker -v
Docker version 18.09.8, build 0dd43dd87f
# systemctl start docker
# systemctl enable docker
2, 所有节点配置加速器和将cgroupdrivier改为systemd,并重启docker服务
# vim /etc/docker/daemon.json
{
"registry-mirrors":
["https://42h8kzrh.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
# systemctl restart docker
3, 所有节点安装kubelet,kubeadm,kubectl.并enable kubelet服务(注意:不要start启动)
# yum install kubelet-1.15.1-0 kubeadm-1.15.1-0 kubectl1.15.1-0 -y
# systemctl enable kubelet
Kubelet负责与其他节点集群通信,并进行本节点Pod和容器的管理。
Kubeadm是Kubernetes的自动化部署工具,降低了部署难度,提高效率。
Kubectl是Kubernetes集群管理工具。
在master节点上操作(其它节点不操作)
注意: 初始化的过程中需要下载1G大小左右的镜像,所以可以提前将我在笔记里准备好的镜像分别在master和node节点上使用docker load导入
[root@master ~]# kubeadm init --kubernetes-version=1.15.1 --apiserver-advertise-address=192.168.122.11 --imagerepository registry.aliyuncs.com/google_containers --service-cidr=10.2.0.0/16 --pod-network-cidr=10.3.0.0/16
[init] Using Kubernetes version: v1.15.1
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a
Kubernetes cluster
.................
验证镜像
[root@master /]# docker images
警告:
[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the
Docker cgroup driver. The recommended driver is "systemd".
Please follow the guide at
https://kubernetes.io/docs/setup/cri/
解决: cgroup 驱动建议为systemd
报错:
[ERROR Swap]: running with swap on is not supported.
Please disable swap
[preflight] If you know what you are doing, you can make a
check non-fatal with `--ignore-preflight-errors=...`
解决: kubernetes1.8开始需要关闭swap
在master节点上操作(其它节点不操作)
执行 export KUBECONFIG=/etc/kubernetes/admin.conf 就可以启动集群(加到/etc/profile里实现开机自动启动)
确认kubelet服务启动了
[root@master ~]# systemctl status kubelet.service
[root@master ~]# vim /etc/profile
export KUBECONFIG=/etc/kubernetes/admin.conf
[root@master ~]# source /etc/profile
查看集群状态
[root@master ~]# kubectl get cs # cs为
componentstatus
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health":"true"}
[root@master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
master NotReady master 6m v1.15.1
参考: https://github.com/coreos/flannel
在master节点上操作(其它节点不操作)
1,下载kube-flannel.yml
[root@master ~]# mkdir /root/k8s
[root@master ~]# cd /root/k8s/
[root@master k8s]# curl -O
https://raw.githubusercontent.com/coreos/flannel/master/Do
cumentation/kube-flannel.yml
2, 应用kube-flannel.yml创建pod(这一步非常慢,因为要下载镜像,可以使用共享的镜像先导入)
[root@master k8s]# kubectl apply -f kube-flannel.yml
podsecuritypolicy.extensions/psp.flannel.unprivileged
created
............
3, 要确认所有的pod为running状态
[root@master k8s]# kubectl get pods -n kube-system
NAME READY STATUS
RESTARTS AGE
coredns-bccdc95cf-d576d 1/1 Running 0
64m
coredns-bccdc95cf-xc8l4 1/1 Running 0
........................
[root@master ~]# kubeadm reset
[root@master ~]# ifconfig cni0 down
[root@master ~]# ip link delete cni0
[root@master ~]# ifconfig flannel.1 down
[root@master ~]# ip link delete flannel.1
[root@master ~]# rm -rf /var/lib/cni/
[root@master k8s]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 66m v1.15.1
1, node1上join集群
[root@node1 ~]# kubeadm join 192.168.122.11:6443 --token cyoesa.wyuw7x30j0hqu7sr --discovery-token-ca-cert-hash sha256:883260472d0cab8c301b99aefcbedf156209a4bf4df1d98466e6bb34c1dcfb37
[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with
'kubectl -n kube-system get cm kubeadm-config -oyaml'
[kubelet-start] Downloading configuration for the kubelet
from the "kubelet-config-1.15" ConfigMap in the kubesystem namespace
.........................
2, node2上join集群
[root@node2 ~]# kubeadm join 192.168.122.11:6443 --token cyoesa.wyuw7x30j0hqu7sr --discovery-token-ca-cert-hash sha256:883260472d0cab8c301b99aefcbedf156209a4bf4df1d98466e6bb34c1dcfb37
[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster...
..............................
在master上验证集群OK
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 88m v1.15.1
node1 Ready 3m42s v1.15.1
node2 Ready 101s v1.15.1
移除节点的做法(假设移除node2)
1, 在master节点上执行
[root@master ~]# kubectl drain node2 --delete-local-data --force --ignore-daemonsets
[root@master ~]# kubectl delete node node2
2, 在node2节点上执行
[root@node2 ~]# kubeadm reset
[root@node2 ~]# ifconfig cni0 down
[root@node2 ~]# ip link delete cni0
[root@node2 ~]# ifconfig flannel.1 down
[root@node2 ~]# ip link delete flannel.1
[root@node2 ~]# rm -rf /var/lib/cni/
3,在node1上执行
[root@node1 ~]# kubectl delete node node2