官方中文文档
:https://www.kubernetes.org.cn/docs
它是一个全新的容器技术的分布式架构领先方案。Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部:Borg)。在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。
Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful)。Kubernetes提供了应用部署,规划,更新,维护的一种机制。
Kubernetes一个核心的特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行着(比如用户想让apache一直运行,用户不需要关心怎么去做,Kubernetes会自动去监控,然后去重启,新建,总之,让apache一直提供服务),管理员可以加载一个微型服务,让规划器来找到合适的位置,同时,Kubernetes也系统提升工具以及人性化方面,让用户能够方便的部署自己的应用。
Kubernetes是一个完备的分布式系统支撑平台,具有完备的集群管理能力,多扩多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和发现机制、內建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制以及多粒度的资源配额管理能力。同时Kubernetes提供完善的管理工具,涵盖了包括开发、部署测试、运维监控在内的各个环节。
在集群管理方面,Kubernetes将集群中的机器划分为一个Master节点
和一群工作节点Node
。 其中,在Master节点运行着集群管理相关的一组进程kube-apiserver、kube-controller-manager和kube-scheduler,这些进程实现了整个集群的资源管理、Pod调度、弹性伸缩、安全控制、系统监控和纠错等管理能力,并且都是全自动完成的。Node作为集群中的工作节点,运行真正的应用程序,在Node上Kubernetes管理的最小运行单元是Pod。Node上运行着Kubernetes的kubelet、kube-proxy服务进程,这些服务进程负责Pod的创建、启动、监控、重启、销毁以及实现软件模式的负载均衡器
Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, etc),一切都基于分布式的存储系统
Kubernetes主要由以下几个核心组件组成:
etcd
:保存了整个集群的状态
apiserver
:提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制
controller manager
:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等
scheduler
:负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上
kubelet
:负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理
Container runtime
:负责镜像管理以及Pod和容器的真正运行(CRI)
kube-proxy
:负责为Service提供cluster内部的服务发现和负载均衡
除了核心组件,还有一些推荐的Add-ons:
kube-dns
:负责为整个集群提供DNS服务
Ingress Controller
:为服务提供外网入口
Heapster
:提供资源监控
Dashboard
:提供GUI
Federation
:提供跨可用区的集群
Fluentd-elasticsearch
:提供集群日志采集、存储与查询
Kubernetes设计理念和功能其实就是一个类似Linux的分层架构
核心层
:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境
应用层
:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)
管理层
:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)
接口层
:kubectl命令行工具、客户端SDK以及集群联邦
生态系统
:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴
(1)关闭节点的selinux和iptables防火墙
systemctl stop firewalld && systemctl disable firewalld
vim /etc/config/selinux
SELINUX=enforcing改为SELINUX=disabled,保存后退出
(2)所有节点(使用三个虚拟机实验)安装和部署好docker (server1 server2 server3) 其中,server4作为harbor仓库提供镜像支持
清理之前的环境(由于之前做过swarm集群的搭建,如果没有的话跳过即可)
docker swarm leave
docker container prune
docker swarm leave --force
docker container prune
(在所有节点都要做)
step1 时间同步:
yum install -y ntpdate
ntpdate time.windows.com
方法2:
真机与阿里云时间同步
vim /etc/chrony.conf
7 server ntp1.aliyun.com iburst
23 allow 172.25/16
systemctl start chronyd
chronyc sources -v
在虚拟机中同步真机的时间:
yum install chrony -y
vim /etc/chrony.conf
server 172.25.15.1 iburst
systemctl start chronyd
systemctl enable chronyd
chronyc sources -v
step2 在每个节点添加私有仓库的解析:
vim /etc/hosts
172.25.254.1 server1 reg.westos.org
172.25.254.2 server2
172.25.254.3 server3
172.25.254.4 server4
step3 master与node之间免密:
ssh-keygen
ssh-copy-id server3
ssh-copy-id server4
step4 关闭swap分区:
swapoff -a #临时关闭
vim /etc/fstab #禁用
# /dev/mapper/rhel-swap swap swap defaults 0 0
(3)配置系统内核参数使流过网桥的流量也进入iptables/netfilter框架中
step1 将桥接的IPv4流量传递到iptables的链:
确保在sysctl配置中的 net.bridge.bridge-nf-call-iptables 被设置为 1
[root@server1 ~]# cat /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
sysctl --system ---加载配置
[root@server1 ~]# sysctl -p
(4)部署docker,k8s
step2 安装kubernetes和docker
docker的安装方法在这里不再赘述
部署k8s的yum源:
cd /etc/yum.repos.d/
vim kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
yum install docker-ce kubelet kubeadm kubectl container-selinux-2.77-1.el7.noarch.rpm -y
step3 将cgroupdriver改为systemd:
三个节点(server1 server2 server3)
官网:
https://kubernetes.io/docs/setup/production-environment/container-runtimes/#docker
# vim /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
cd /sys/fs/cgroup
ls #systemd目录的路径
mkdir -p /etc/systemd/system/docker.service.d
systemctl daemon-reload
systemctl restart docker
step4 启动kublet和docker:
systemctl start docker
systemctl enable docker
systemctl start kubelet
systemctl enable kubelet
step5 指定仓库拉取镜像:
首先我们查看kubeadm的配置信息
kubeadm config print init-defaults
可以看到它默认从k8s.gcr.io上下载镜像,需要,国内拉取不可以,
所以我们直接指定下载时仓库的地址:
kubeadm config images list --image-repository registry.aliyuncs.com/google_containers
//列出所需镜像
从阿里云上拉取kubeadm所需的镜像
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
###--kubernetes-version //指定k8s安装版本
(10)将拉取的k8s镜像上传到harbor私有仓库,使得其他节点在部署的时候可以快速在不连接外部网络的情况下从harbor仓库拉取所需要的镜像
首先我们可以新建一个名为kubernetes的仓库
给镜像批量改名:
for i in `docker images | grep registry.aliyuncs.com | awk '{print $1":"$2}'|awk -F / '{print $3}'`;do docker tag registry.aliyuncs.com/google_containers/$i reg.westos.org/kubernetes/$i; done
docker images | grep reg.westos.org
上传:
for i in `docker images | grep reg.westos.org|awk '{print $1":"$2}'`;do docker push $i ;done
我们要在其他节点上都部署好私有仓库,将证书发送过去:
scp -r certs.d server2/3:/etc/docker
ca.crt
测试私有仓库:
yum install bash-* -y
docker pull reg.westos.org/kubernetes/kube-proxy:v1.18.1 #尝试拉取
docker images
docker rmi reg.westos.org/kubernetes/kube-proxy:v1.18.1 #删除
(11)初始化集群 (使用harbor仓库)
step7 启动kubernetes集群
这里我们选择plannel网络
kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository reg.westos.org #指定私有仓库的镜像源(harbor)
--pod-network-cidr=10.244.0.0/16 //使用flannel网络组件时必须添加
--kubernetes-version //指定k8s安装版本
(12)节点扩容:
step8 node节点加入集群:
kubeadm join 172.25.254.1:6443 --token bxkh88.3xppwvn19x2b79pp --discovery-token-ca-cert-hash sha256:0abdd176472e86a55bfc7dc99f553dc62e6d163089e833027e788a8645ef891c
注意:sha256后面的内容是启动集群时生成的的信息
查看节点状态:
kubectl get nodes
kubectl get pod -n kube-system
(13)配置kubectl
useradd kubeadm
visudo
su - kubeadm
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
step9 配置kubectl命令补齐功能:
echo "source <(kubectl completion bash)" >> ~/.bashrc
source .bashrc
(14)安装flannel网络组件
https://github.com/coreos/flannel
step10 flannel网络管理:
我们可以看到在这之前节点的状态,前两行一直是pending状态,原因是缺少网络模型
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml
网址无法拉取的时候:
复制kube-flannel.yml文件
使用\vi kube-flannel.yml
进行复制不会出错
[kubeadm@server1 ~]$ ls
kube-flannel.yml
[kubeadm@server1 ~]$ kubectl apply -f kube-flannel.yml
podsecuritypolicy.policy/psp.flannel.unprivileged configured
clusterrole.rbac.authorization.k8s.io/flannel unchanged
clusterrolebinding.rbac.authorization.k8s.io/flannel unchanged
serviceaccount/flannel unchanged
configmap/kube-flannel-cfg unchanged
daemonset.apps/kube-flannel-ds-amd64 unchanged
daemonset.apps/kube-flannel-ds-arm64 unchanged
daemonset.apps/kube-flannel-ds-arm unchanged
daemonset.apps/kube-flannel-ds-ppc64le unchanged
daemonset.apps/kube-flannel-ds-s390x unchanged
[kubeadm@server1 ~]$
(15) Master查看状态
# kubectl get cs
# kubectl get node
# kubectl get pod -n kube-system
[kubeadm@server1 ~]$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
server1 Ready master 100m v1.18.1
server2 Ready <none> 100m v1.18.1
server3 Ready <none> 100m v1.18.1
[kubeadm@server1 ~]$
[kubeadm@server1 ~]$ kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-67cc868bc6-r79c5 1/1 Running 0 101m
coredns-67cc868bc6-t6hf8 1/1 Running 0 101m
etcd-server1 1/1 Running 0 101m
kube-apiserver-server1 1/1 Running 0 101m
kube-controller-manager-server1 1/1 Running 0 101m
kube-flannel-ds-amd64-6f97n 1/1 Running 0 96m
kube-flannel-ds-amd64-v96jq 1/1 Running 0 96m
kube-flannel-ds-amd64-zrqbp 1/1 Running 0 96m
kube-proxy-dg5fr 1/1 Running 0 101m
kube-proxy-gjn66 1/1 Running 0 101m
kube-proxy-r5kj9 1/1 Running 0 101m
kube-scheduler-server1 1/1 Running 0 101m
[kubeadm@server1 ~]$
当它的状态都为running时,集群就部署成功了!