传统部署时代,程序直接部署在物理服务器之上,传统的方式带来了几个问题
一、物理资源的浪费,CPU与内存资源等计算资源;
二、对于不可靠的应用程序,由于程序的问题占用所有系统资源,致使服务器之上的其余程序没法工做;
三、扩容缩容操做须要新加物理设备,还须要割接,形成大量的金钱和人力的浪费
四、集成,部署操做相对于云时代过于复杂
容器部署时代:由于容器所具备的诸多优点,因此咱们开始学习容器与容器编排工具html
容器时代,咱们要使用容器部署集群应用,就离不开容器编排工具;而在业界,k8s占据了80%的市场份额,而且k8s的前身borg已经在谷歌稳定运行数十年,能够说,k8s是站在巨人的肩膀上。node
K8s能够自动装箱,自我修复,水平扩展,服务发现和负载均衡,自动发布和回滚
密钥和配置管理,存储编排,批处理执行。linux
(架构图引自马哥文档)git
一组master做为集群惟一入口,每个node节点向集群贡献计算,存储等资源;客户端请求先发给master,master使用 scheduler(调度器)分析各node现有的可用资源,找一个最佳适配运行用户所请求容器的节点,调度该node负责实现用户请求;k8s能够自托管。
master上的API server是负责接收解析请求,scheduler负责分析各node上的计算和存储资源,并根据用户的请求进行两级调度,第一级预选有几个节点符合用户请求,第二级在符合用户请求的几个节点中优选出最佳节点来响应用户请求;
master上的组件controller-manager负责监控着每个controller的健康状态,若是controller宕机,controller-manager会向API server请求从新建立controller
在一个集群中,master通常有三个,做成高可用,这样不论是API server scheduler,controller-manager中的哪个宕机,都能保证服务的不间断稳定运行
每个master的数据都是存在一个共享存储etcd上的,etcd是一个键值存储数据库,比较像是zookeeper,etcd中存储了整个集群的状态信息,因此etcd通常要做高可用,同时,etcd之间通讯通常用https的方式,因此etcd内部通讯须要一套CA和签署证书,etcd与API Server通讯须要一套CA和签署证书,API Server与客户端通讯须要一套CA和签署证书,API Server与kubelet、API Server与kube-proxy通讯一样须要一套CA和签署证书。github
kube-proxy用来管理service,当pod发生改变后,Label selector将消息报告给
API Server,API Server将这一事件通知给全部关联的组件知悉, kube-proxy知悉后改变本地node的iptables规则(service);service的改变须要依靠kube-proxy改变本地的iptables规则。
每个node上都有一个kubelet,kubelet负责保证node始终处于健康运行状态,当node节点宕机时,controller会向API server发送请求,请求从新建立node;controller会在本地不断循环,周期性探测容器的健康状态,确保服务的不间断运行。docker
逻辑架构:pod,label,label selector,namespace
pod:k8s上的最小调度单元,一个pod能够包含多个容器,这些容器共享同一个底层的namespace,pod更像是一个虚拟机,而pod上的各容器就像是运行在虚拟机之上的各个服务;同一个pod还可共享存储卷;一个pod中的容器通常以一个为主,其余为辅;
label: pod之上能够打上label,用label来识别pod,label是一个key=value形式的值
label selector:根据label来过滤符合条件的资源
namespace:namespace 能够将一个物理的 Cluster 逻辑上划分红多个虚拟 Cluster,每一个 Cluster 就是一个 namespace。不一样 namespace 里的资源是彻底隔离的。数据库
集群经过pod控制器管理pod
ReplicaSet(副本控制集):pod的多副本管理
Deployment:只能管理无状态应用,经过ReplicaSet管理pod的多副本
StatefulSet:管理有状态应用,保证pod的每一个副本在整个生命周期名称不变
DaemonSet:在指定node上运行一个pod的场景
Job,ctonjob :用于任务结束后pod生命周期结束的场景json
service为pod提供一个稳定的访问入口,作到了服务发现与服务注册功能,同时还有控制器的功能
客户端访问service,service将客户端的请求代理到后端的pod上,在后端pod改变时,service能动态发现新的pod,并将其加入。
service在1.10版本以前经过iptables deny规则实现,1.11版本后经过ipvs实现vim
附件是为集群提供功能,附件的namespace在kube-system中
coreDNS:用于集群内名称解析
Web UI:集群管理UI
Container Resource Monitoring:资源检测
Cluster-level Logging:集群级日志记录后端
CNI:第三方网络组件
flannel:网络配置,三层隧道叠加网络,简单
calico:网络配置,网络策略,支持BGP协议的路由直通模型,复杂
canel:flannel与calico结合,flannel提供网络配置,calico提供网络策略
系统:CentOS 7
Docker-ce:18.09
K8s:1.15.1
使用flannel网络
节点网络:192.168.118.0/24
pod网络:10.244.0.0/16(flannel默认的)
service网络:10.96.0.0/12
master:192.168.118.220
Node1:192.168.118.221
Node2:192.168.118.222
各节点主机名称解析
配置DNS或/etc/hosts文件
192.168.118.220 k8s-master 192.168.118.221 k8s-node1 192.168.118.222 k8s-node2
各节点时间同步
uptime 192.168.118.220
关闭防火墙和selinux
systemctl stop firewalld.service systemctl disable firewalld.service sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config reboot
各节点公钥免密
ssh-copy-id 192.168.118.221 ssh-copy-id 192.168.118.222
下载地址: https://pkgs.org/download/
下载yum-utils以及其依赖包
[root@k8s-master k8s]# cat > /etc/yum.repos.d/kubernetes.repo << EOF > [kubernetes] > name=Kubernetes > baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 > enabled=1 > gpgcheck=1 > repo_gpgcheck=1 > gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg > EOF
yumdownloader --resolve kubelet kubeadm kubectl kubernetes-cni conntrack-tools libnetfil ter_cthelper libnetfilter_cttimeout libnetfilter_queue socat
当前k8s认证的docker-ce版本为18.09
下载地址: https://pkgs.org/download/
4.五、安装docker
yum localinstall containerd.io-1.2.5-3.1.el7.x86_64.rpm docker-ce-18.09.8-3.el7.x86_6 4.rpm docker-ce-cli-18.09.8-3.el7.x86_64.rpm container-selinux-2.99-1.el7_6.noarch.rpm systemctl start docker
docker pull k8s.gcr.io/kube-apiserver:v1.15.1 docker pull k8s.gcr.io/kube-controller-manager:v1.15.1 docker pull k8s.gcr.io/kube-scheduler:v1.15.1 docker pull k8s.gcr.io/kube-proxy:v1.15.1 docker pull k8s.gcr.io/coredns:1.3.1 docker pull k8s.gcr.io/pause:3.1 docker pull k8s.gcr.io/etcd:3.3.10
docker save k8s.gcr.io/kube-apiserver:v1.15.1 > ~/k8s-image/kube-apiserver.tar docker save k8s.gcr.io/kube-controller-manager:v1.15.1 > ~/k8s-image/kube-controller-manager.tar docker save k8s.gcr.io/kube-scheduler:v1.15.1 > ~/k8s-image/kube-scheduler.tar docker save k8s.gcr.io/kube-proxy:v1.15.1 > ~/k8s-image/kube-proxy.tar docker save k8s.gcr.io/coredns:1.3.1 > ~/k8s-image/coredns.tar docker save k8s.gcr.io/pause:3.1 > ~/k8s-image/pause.tar docker save k8s.gcr.io/etcd:3.3.10 > ~/k8s-image/etcd.tar
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
将下载的依赖包,以及docker-ce,k8s的rpm包,k8s的镜像包放在集群全部节点上
scp -r docker root@192.168.118.221:/root scp -r k8s root@192.168.118.221:/root scp -r k8s-image root@192.168.118.221:/root
[root@k8s-master ~]# cat > /etc/sysctl.d/kubernetes.conf << EOF > net.ipv4.ip_forword = 1 > net.bridge.bridge-nf-call-ip6tables = 1 > net.bridge.bridge-nf-call-iptables = 1 > EOF
modprobe br_netfilter sysctl --system
vim /etc/sysconfig/kubelet KUBELET_EXTRA_ARGS="--fail-swap-on=false"
安装4.5步骤
yum localinstall ./docker/*.rpm systemctl start docker
安装4.3步骤下载的rpm包(全部节点)
yum localinstall ./k8s/*.rpm
K8s命令补全(全部节点)
source <(kubectl completion bash) echo "source <(kubectl completion bash)" >> ~/.bashrc
导入镜像(全部节点)
find . -name "*.tar" -exec docker image load -i {} \;
kubelet开机启动(全部节点)
systemctl enable kubelet
初始化master节点
kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=Swap,NumCPU --apiserver-advertise-address=192.168.118.220 --kubernetes-version v1.15.1
提示须要将docker的cgroup driver改成systemd
vim /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"] } systemctl daemon-reload systemctl restart docker systemctl enable docker
提示须要关闭swap以及cpu个数为2,我这里是虚拟机环境,因此跳过
重置初始化
kubeadm reset
继续初始化
kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=Swap,NumCPU --apiserver-advertise-address=192.168.118.220 --kubernetes-version v1.15.1
保存加入集群信息
kubeadm join 192.168.118.220:6443 --token ioiy2e.w5c73hie10whtrx0 \ --discovery-token-ca-cert-hash sha256:0b309b3968902b155097c24912bdf7e695f9dba7523db6b7b854b40f0532f39a
普通用户要使用k8s 须要执行下面操做
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
若是是root 能够直接执行
export KUBECONFIG=/etc/kubernetes/admin.conf
以上两个二选一便可,我这里用root
export KUBECONFIG=/etc/kubernetes/admin.conf
确认master各组件状态
[root@k8s-master docker]# kubectl get cs NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-0 Healthy {"health":"true"}
将admin配置文件复制到全部node节点
scp /etc/kubernetes/admin.conf k8s-node1:/etc/kubernetes/ scp /etc/kubernetes/admin.conf k8s-node2:/etc/kubernetes/
配置环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
当即生效
source ~/.bash_profile
kubectl apply -f kube-flannel.yml
[root@k8s-master k8s]# kubectl get node NAME STATUS ROLES AGE VERSION k8s-master Ready master 7m42s v1.15.1
[root@k8s-master k8s]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE k8s.gcr.io/kube-scheduler v1.15.1 b0b3c4c404da 6 days ago 81.1MB k8s.gcr.io/kube-controller-manager v1.15.1 d75082f1d121 6 days ago 159MB k8s.gcr.io/kube-apiserver v1.15.1 68c3eb07bfc3 6 days ago 207MB k8s.gcr.io/kube-proxy v1.15.1 89a062da739d 6 days ago 82.4MB quay.io/coreos/flannel v0.11.0-amd64 ff281650a721 5 months ago 52.6MB k8s.gcr.io/coredns 1.3.1 eb516548c180 6 months ago 40.3MB k8s.gcr.io/etcd 3.3.10 2c4adeb21b4f 7 months ago 258MB k8s.gcr.io/pause 3.1 da86e6ba6ca1 19 months ago 742kB
将docker的cgroup driver改成systemd
vim /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"] } systemctl daemon-reload systemctl restart docker systemctl enable docker
加入集群(跳过swap)
kubeadm join 192.168.118.220:6443 --token ioiy2e.w5c73hie10whtrx0 --discovery-token-ca-cert-hash sha256:0b309b3968902b155097c24912bdf7e695f9dba7523db6b7b854b40f0532f39a --ignore-preflight-errors=Swap
配置环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
当即生效
source ~/.bash_profile
[root@k8s-master ~]# kubectl get node NAME STATUS ROLES AGE VERSION k8s-master Ready master 29m v1.15.1 k8s-node1 Ready <none> 110s v1.15.1 k8s-node2 Ready <none> 107s v1.15.1
使用kubeadm方式部署k8s集群,要添加新的node加入集群,而默认token 24小时就会过时,因此超出24小时就要从新建立token
建立token
[root@k8s-master manifests]# kubeadm token create 3llex6.jb3l5afms93aexj5
获取ca证书sha256编码hash值
[root@k8s-master manifests]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* / /' 0b309b3968902b155097c24912bdf7e695f9dba7523db6b7b854b40f0532f39a
加入集群新的命令
kubeadm join 192.168.118.220:6443 --token 3llex6.jb3l5afms93aexj5 --discovery-token-ca-cert-hash sha256:0b309b3968902b155097c24912bdf7e695f9dba7523db6b7b854b40f0532f39a --ignore-preflight-errors=Swap
yumdownloader --resolve ipset ipvsadm
yum localinstall ./ipvs/ip* scp -r /root/ipvs k8s-node1:/root/ scp -r /root/ipvs k8s-node2:/root/
Node1:yum localinstall ./ipvs/ip* Node2:yum localinstall ./ipvs/ip*
modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4
lsmod | grep -e ipvs -e nf_conntrack_ipv4
kubectl edit configmap kube-proxy -n kube-system
kubectl get pod -n kube-system | grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
kubectl get pod -n kube-system | grep kube-proxy kubectl logs kube-proxy-7fsrg -n kube-system
出现Using ipvs Proxier便可
https://www.jianshu.com/p/89f126b241db ipvs与iptables对比
https://ahmermansoor.blogspot.com/2019/04/install-kubernetes-k8s-offline-on-centos-7.html offline方式部署k8s
https://www.kubernetes.org.cn/5551.html 使用kubeadm安装Kubernetes 1.15
https://www.kubernetes.org.cn/doc-4 k8s中文文档马哥文档