1.3 Kubernetes集群架构组件
1)Master组件

kube-apiserver
(Kubernetes API)集群的统一入口,各组件协调者,以RESTful API提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd存储。
kube-controller-manager
处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的
kube-schedule
根据调度算法为新创建的Pod选择一个Node节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上
etcd
分布式键值存储系统。用于保存集群状态数据,比如Pod、Service等对象信息。
2)Node组件 
kubelet
kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器
kube-proxy
在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。
docker 或 rocket
容器引擎,运行容器
1)Pod

最小部署单元
一组容器的集合
一个Pod中的容器共享网络命名空间
Pod是短暂的
2)Controller

ReplicaSet:确保预期的Pod副本数量
Deployment:无状态应用部署
StatefulSet:有状态应用部署
DaemonSet:确保所有Node运行同一个Pod
Job:一次性任务
Cronjob:定时任务
3)更高级层次对象,部署和管理Pod

Service:
防止Pod失联;定义一次Pod的访问策略
Service抽象层不过是iptables或者ipvs中的规则而已
Label:标签,附加到某个资源上,用于关联对象、查询和筛选
Namespaces:命名空间,将对象逻辑上隔离
Annotations:注释
4)网络解决方案

K8S通过CNI插件体系来接入外部网络服务解决方案
常见的有:
flannel:网络配置相关
calico:网络配置、网络策略
canel:flannel的网络配置 + calico的网络策略
5)三种网络

Pod网络:Pod的地址是配置在Pod内部的网络名称空间上的,是能ping通的,就像正常主机上的地址一样
Service网络(集群网络):Service的地址是虚拟的,它只存在于iptables或者ipvs的规则之中
节点网络:各个节点也应该有一个网络
各个Pod运行在同一个网络中,而service是另外一个网络;Pod和service的地址是不同网段的。

接入外部访问时,先接入节点网络,然后由节点网络代理至集群网络,再由集群网络代理至Pod网络。

同一Pod内的多个容器之间通过 lo 接口进行通信。

两个Pod之间可以直接进行通信:通过隧道的方式(Overlay叠加网络)来转发二层报文,使得它们虽然扩主机但是好像工作在同一个二层网络中。访问对方Pod所在节点的位置,然后再代理到Pod内部的容器上。

 

安装kubeadmin1.15.0

在不同的节点上执行下面命令

hostnamectl set-hostname master1
hostnamectl set-hostname node1
hostnamectl set-hostname node2
 

一:整体架构

192.168.11.130 master1
192.168.11.131 node1
192.168.11.132 node2
  • kubeadm:可以把kubeadmin看成一个部署工具,它简化K8s的部署过程。

二:准备工作(master、node1、node2执行)

 检查master、node1、node2是否能上外网 关闭防火墙

systemctl stop firewalld.service
systemctl disable firewalld.service

  • 关闭SELinux

sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
getenforce

  • 禁用Swap

swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab

在所有的Kubernetes节点执行以下脚本(若内核大于4.19替换nf_conntrack_ipv4为nf_conntrack):
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
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 && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
#安装相关管理工具
yum install ipset ipvsadm -y

 

服务器校对时间

# 安装 chrony 服务,centos7.8默认自带了,没有的按如下安装
yum install -y chrony
systemctl start chronyd
systemctl enable chronyd
 

  • 配置主机ip映射及主机名

 cat <<EOF >> /etc/hosts
192.168.11.130 master1
192.168.11.131 node1
192.168.11.132 node2
EOF
cat /etc/hosts

reboot

安装docker

yum -y install wget
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce-18.06.1.ce-3.el7
systemctl enable docker && systemctl start docker
docker --version

配置Docker的镜像加速器 


sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://nu4ynvqu.mirror.aliyuncs.com"]
}
{
  "log-driver": "json-file",
  "log-opt": {
      "max-size": "100m",
      "max-file": "3"
  }
 
EOF

 配置阿里云的Kubernetes源

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

  • 配置内核参数,将桥接的IPv4流量传递到iptables的链

cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
 

  • systemd驱动

vim /usr/lib/systemd/system/docker.service
#修改为systemd
ExecStart=/usr/bin/dockerd --exec-opt native.cgroupdriver=systemd
systemctl daemon-reload
systemctl restart docker
 

  • 所有节点安装kubeadm,kubelet和kubectl。(指定版本安装,不指定默认最新版本安装;)缘由:kubelet运行在 Cluster 所有节点,负责启动 Pod 和容器,kubeadm 用于初始化 Cluster,Kubectl是kubernetes命令行工具,通过kubectl可以部署和管理应用,查看各种资源、创建、删除和更新各种组件。

yum install -y kubeadm-1.15.0-0 kubectl-1.15.0-0 kubelet-1.15.0-0
systemctl enable kubelet
 

三:初始化(master执行)

kubeadm config images list
kubeadm init --apiserver-advertise-address=192.168.11.130 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.15.0 --service-cidr=10.1.0.0/16 --pod-network-cidr=10.244.0.0/16 

 –image-repository
string:这个用于指定从什么位置来拉取镜像(1.13版本才有的),默认值是k8s.gcr.io,我们将其指定为国内镜像地址:registry.aliyuncs.com/google_containers
最后生成的命令记录下来,后边使用kubeadm join往集群中添加节点时会用到;
kubeadm join 192.168.11.130 --token qd3apb.ly13dx5944yxhykw --discovery-token-ca-cert-hash sha256:71de75d66c44eb49c4a330714df6183ec3eb46d1952bc951474724eb44aef0d5

配置 kubectl 命令

无论在master节点或node节点,要能够执行kubectl命令必须进行以下配置,从节点没有/etc/kubernetes/admin.conf就拷贝过去执行以下命令

mkdir -p $HOME/.kube

scp -r /etc/kubernetes/admin.conf root@node1:/etc/kubernetes/

scp -r /etc/kubernetes/admin.conf root@node2:/etc/kubernetes/
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes

cat << EOF >> ~/.bashrc
export KUBECONFIG=/etc/kubernetes/admin.conf
EOF
source ~/.bashrc
 

查看k8s节点情况

[root@k8s-master1 ~]# kubectl get node
NAME         STATUS     ROLES    AGE     VERSION
master1   NotReady   master   7m46s   v1.15.0
 

此时主节点状态为NotReady,因为我们k8s集群要求一个扁平化的网络存在,由于我们还没构建flanneld网络插件。由于在上面 kubeadm init后,我们没有进行kubeadm join 所有现在我们还看不到 node 的信息

四:安装flannel(master执行)在master节点上安装即可,其他节点加入k8s集群后会自动安装

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
 

[root@k8s-master ~]# mkdir k8s
wget -P k8s/ https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 访问不了这个网址,下不下来,可以借助阿里云的ECS可以下载
# kube-flannel.yml 里面的镜像地址quay.io/coreos/flannel:v0.13.0 拉取不下来,修改为国内的地址后,还拉取不下来,
# 由于是镜像,可以把该镜像从github拉下来,https://github.com/coreos/flannel/releases,然后 
docker load -i flanneld-v0.13.0-amd64.docker

如果flannel因为网络问题安装失败,需要进行重新安装 kubectl delete -f kube-flannel.yml # 然后重新安装 kebectl apply -f kube-flannel.yml

docker images 查看镜像名称,将kube-flannel.yml里的两个镜像地址改成本地镜像名称和版本,就可以在本地拉取制作镜像了,注意镜像名称和配置文件里的一定要一致,当时我是电脑倒入。

或者

docker pull jinbian/flannel:v0.12.0-amd64

vi kube-flannel.yml

# 再次执行部署flannel
kubectl apply -f kube-flannel.yml

kubectl get pod -n kube-system

kubectl get nodes

 五:加入node1、node2节点(node1、node2节点运行)

kubeadm join 192.168.11.130:6443 --token qd3apb.ly13dx5944yxhykw --discovery-token-ca-cert-hash sha256:71de75d66c44eb49c4a330714df6183ec3eb46d1952bc951474724eb44aef0d5

在 master1 上查看 节点和各个组件以pod的方式来运行的状态 

kubectl get pod -n kube-system -o wide

kubectl get nodes

kube-proxy 开启ipvs

kubectl get configmap kube-proxy -n kube-system -o yaml > kube-proxy-configmap.yaml
sed -i 's/mode: ""/mode: "ipvs"/' kube-proxy-configmap.yaml
kubectl apply -f kube-proxy-configmap.yaml
rm -f kube-proxy-configmap.yaml
kubectl get pod -n kube-system | grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'

 

 

查看IPVS配置 

yum install -y ipvsadm
ipvsadm -ln
 

补充扩展:k8s的图形化管理工具之 kuboard 

wget  https://kuboard.cn/install-script/kuboard.yaml
kubectl apply -f kuboard.yaml 
# 如果您参考 www.kuboard.cn 提供的文档安装 Kuberenetes,可在第一个 Master 节点上执行此命令# 获取token,为登录kuboard做准备
echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep ^kuboard-user | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d)

 访问地址:http://192.168.11.130:32567 

Kubernetes集群信息查看及管理 

3.1 Pod的创建与查看
1)信息查看

# 查看k8s集群的整体信息
kubectl  cluster-info

# 查看当前系统上已经被创建的控制器
kubectl get deployment

# 查看pod的相关信息
kubectl get pods
kubectl get pods -o wide  # 查看更详细的信息

# 查看services的相关信息
kubectl get services
kubectl get svc

# 查看kube-system名称空间中service的相关信息
kubectl get svc -n kube-system
2)创建一个pod

# 创建并运行一个特定的镜像,暴露80端口,并且只创建1个副本,干跑模式需要再加上--dry-run=true
kubectl run nginx-deploy --image=nginx:1.14 --port=80 --replicas=1

# 如果要镜像中运行其他程序,可以写成这样(注意前面要加 -- )
kubectl run nginx-deploy --image=nginx:1.14 --port=80 --replicas=1 -- /bin/sh
 3)对刚刚创建的pod进行查看并访问

[root@k8s-master01 ~]# kubectl get pods -o wide
NAME           READY   STATUS    RESTARTS   AGE    IP           NODE         NOMINATED NODE   READINESS GATES
nginx-deploy   1/1     Running   0          3m6s   10.244.1.2   k8s-node01   <none>           <none>
[root@k8s-master01 ~]# curl 10.244.1.2
3.2 创建pod并暴露端口
在Kubernetes集群中创建一个pod,然后暴露端口,验证其是否可以正常访问
1)创建deployment

# 创建一个deployment控制器,这个控制器的名字就叫nginx-deploy
kubectl create deployment nginx-deploy --image=nginx
2)创建service并暴露端口

kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP # 将nginx-deploy这个控制器(deployment  )相关的pod资源都创建为一个服务,服务名叫nginx
# --name   是service的名称
# --port   是service暴露到外部的端口
# --target-port  是pod暴露的端口
# --protocol     使用的协议,默认就是TCP
# --type         是service的类型,service有多种类型,可kubectl expose --help来查看--type选项,Defaultis 'ClusterIP'
3)查看相关信息并访问

# 查看pod和service的相关信息
[root@k8s-master01 ~]# kubectl get pods,svc
NAME                               READY   STATUS    RESTARTS   AGE
pod/nginx-deploy-8588f9dfb-t8wzr   1/1     Running   0          11m

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   78m
service/nginx        ClusterIP   10.99.193.184   <none>        80/TCP    34s

# 查看kube-system名称空间中service的相关信息
kubectl get svc -n kube-system

# 访问:http://NodeIP:PORT,只有在集群内部的节点上才能被访问到
curl http://10.99.193.184

删除节点

设置节点不可调度
#kubectl cordon local-k8s-nd01
驱逐节点上的pod
#kubectl drain k8s-node1 --delete-local-data --force --ignore-daemonsets
删除节点
#kubectl delete node  k8s-node1
在需要删除的节点上执行reset,这样该节点即完全从 Cluster 中脱离开来
#kubeadm reset

六:常用命令

  • 重置集群节点命令    kubeadm reset 
  • 查询join命令  kubeadm token create --print-join-command

七:服务部署 


 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐