k8s详解

简介

Kubernetes (通常称为K8s,K8s是将8个字母“ubernete”替换为“8”的缩写) 是用于**自动部署、扩展和管理容器化(containerized)应用程序的开源系统。Google设计并捐赠给Cloud Native Computing Foundation(今属Linux基金会)来使用的。

优点

  • 可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)
  • 可扩展: 模块化, 插件化, 可挂载, 可组合
  • 自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展
  • 快速部署应用,快速扩展应用
  • 无缝对接新的应用功能
  • 节省资源,优化硬件资源的使用

重要概念

cluster master node

  • cluster 是计算、存储和网络资源的集合,最简单的 Cluster 可以只有一台主机(它既是 Mater 也是 Node
  • master 是 Cluster 的大脑,它的主要职责是调度,即决定将应用放在哪里运行。为了实现高可用,可以运行多个 Master
  • NodeMaster 管理,Node 负责监控并汇报容器的状态,并根据 Master 的要求管理容器的生命周期。

Pod

  • PodKubernetes 的最小工作单元。
  • 每个 Pod 包含一个或多个容器。Pod 中的容器会作为一个整体被 Master 调度到一个 Node 上运行。

controller

Kubernetes 通常不会直接创建 Pod,而是通过 Controller 来管理 Pod 的。Controller 中定义了 Pod 的部署特性,比如有几个副本,在什么样的 Node 上运行等。为了满足不同的业务场景,Kubernetes 提供了多种 Controller,包括 DeploymentReplicaSetDaemonSetStatefuleSetJob 等。

  1. Deployment:部署无状态应用
  2. Statefulset:部署有状态应用
  3. Replicaset:确保预期的Pod副本数量
  4. Daemonset: 确保node运行同一个pod
  5. Job:一次性任务
  6. Cronjob:定时任务

Service Namespace

  • Service 定义了外界访问一组特定 Pod 的方式。Service 有自己的 IP 和端口,ServicePod 提供了负载均衡。
  • Namespace 可以将一个物理的 Cluster 逻辑上划分成多个虚拟 Cluster,每个 Cluster 就是一个 Namespace。不同 Namespace 里的资源是完全隔离的。

k8s核心组件

组件名称说明
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最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境
应用层部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)
管理层系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)
接口层kubectl命令行工具、客户端SDK以及集群联邦
生态系统在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴
Kubernetes****外部日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等
Kubernetes****内部CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等

安装k8s(老版本)

准备

两台centos服务器,一主一从:

master机: 172.16.101.236

node机: 172.16.101.237

master 和 node

这里是master和node都要安装的软件

//安装epel-release源
yum -y install epel-release

//关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
setenforce 0

//查看防火墙状态
firewall-cmd --state

master

安装etcd kubernetes-master

// 使用yum安装etcd、kubernetes-master
yum -y install etcd kubernetes-master

修改k8s配置文件vi /etc/kubernetes/apiserver

  • 删除KUBE_ADMISSION_CONTROL中的ServiceAccount
  • 以及一些ip修改注释去掉等

修改etcd配置文件vi /etc/etcd/etcd.conf

启动etcd、kube-apiserver、kube-controller-manager、kube-scheduler等服务,并设置开机启动。

for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler; do systemctl restart $SERVICES;systemctl enable $SERVICES;systemctl status $SERVICES ; done

在etcd中定义flannel网络

etcdctl mk /atomic.io/network/config '{"Network":"172.17.0.0/16"}'

node

在node上安装

安装kubernetes Node和flannel组件应用

yum -y install flannel kubernetes-node

修改**/etc/sysconfig/flanneld**文件,为flannel网络指定etcd服务。

这个FLANNEL_ETCD_PREFIX是与上文中的‘/atomic.io/network/config’想对应的,错误的话启动会出错

修改:vi /etc/kubernetes/config文件

修改node机的kubelet配置文件/etc/kubernetes/kubelet

node节点机上启动kube-proxy,kubelet,docker,flanneld等服务,并设置开机启动。

测试

运行 kubectl get nodes可以看到我们的一个节点

[root@localhost data]# kubectl get nodes
NAME             STATUS    AGE
172.16.101.237   Ready     3m

安装k8s(新版本)

# 查看 k8s 版本
kubectl --version
	Kubernetes v1.5.2

可以看到我们上面安装的k8s版本太老还是1.5.2,下面我们会安装1.20版本

卸载

卸载1.5.2版本

//master
yum -y remove etcd kubernetes-master

//安装的时候冲突,conflicts with file from package kubernetes-client-1.5.2-0.7.git269f928.el7.x86_64,所以删除它
yum remove kubernetes-client-1.5.2-0.7.git269f928.el7.x86_64

//node
yum -y remove flannel kubernetes-node
yum remove kubernetes-client-1.5.2-0.7.git269f928.el7.x86_64

安装docker

//安装准备-配置docker yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

//列出当前支持的版本
yum list docker-ce --showduplicates | sort -r 

//安装指定版本
yum install docker-ce-18.06.3.ce-3.el7

//启动 并设置开机自启
systemctl start docker
systemctl enable docker

关闭swap

如果开启了 swap 分区,kubelet 会启动失败(可以通过将参数 --fail-swap-on 设置为false 来忽略 swap on),故需要在每台机器上关闭 swap 分区。

sudo swapoff -a

为了防止开机自动挂载 swap 分区,可以注释 /etc/fstab 中相应的条目。

sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

设置主机名

这个一定要设置不设置的话到时候nodes名称会有问题,我一开始没用设置,后面又进行了修改

//node设置主机名
hostnamectl set-hostname node1

//master设置主机名
hostnamectl set-hostname master

master node 安装

下面操作在master和node都要执行

添加阿里yum源

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

开始安装,启动

yum -y install kubectl-1.20.0 kubelet-1.20.0 kubeadm-1.20.0 && systemctl enable kubelet && systemctl start kubelet

部署master

kubeadm init --kubernetes-version=1.20.0  \
--apiserver-advertise-address=172.16.101.236   \
--image-repository registry.aliyuncs.com/google_containers  \
--service-cidr=10.10.0.0/16 --pod-network-cidr=10.122.0.0/16

–kubernetes-version # 指定的版本

–apiserver-advertise-address # K8S主节点的地址

–pod-network-cidr # pod的网络IP范围

-image-repository #指定国内镜像源,因为初始化需要拉镜像,国外的被墙了

运行上面命令后会生成一个加入集群的命令

kubeadm join 172.16.101.236:6443 --token d2er22.klhu3bkfwgraxc0z \
    --discovery-token-ca-cert-hash sha256:85be1f0bc3edcc7f8aad6037c033f4cdfc5336b3bd910f27437c47349aeb1f00

配置kubectl 认证信息

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile

部署node

kubeadm join 172.16.101.236:6443 --token d2er22.klhu3bkfwgraxc0z --discovery-token-ca-cert-hash sha256:85be1f0bc3edcc7f8aad6037c033f4cdfc5336b3bd910f27437c47349aeb1f00

配置flannel网络

//master : 查看node节点显示当前node状态均为noReady是正常的,配置网络后,就转为ready了
kubectl get node
	NAME                    STATUS     ROLES                  AGE   VERSION
	localhost.localdomain   NotReady   control-plane,master   44m   v1.20.0

//master : 安装flannel网络插件
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml


//master :  将master节点的admin.conf发送到到所有node节点
scp /etc/kubernetes/admin.conf root@172.16.101.237:/etc/kubernetes/admin.conf


//node : 
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile

//再次执行kubectl get node,再master node都可以执行并看到
    NAME                    STATUS   ROLES                  AGE   VERSION
    localhost.localdomain   Ready    control-plane,master   50m   v1.20.0

安装可视化界面

1、Kubernetes Dashboard 是 k8s集群的⼀个 WEB UI管理⼯具,代码托管在 github 上,地址:

`https:``/``/``github.com``/``kubernetes``/``dashboard`

上面可以看到支持的k8s版本

2、master上 安装

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml

修改recommended.yaml

//安装
kubectl apply -f recommended.yaml

访问

//查看被分到哪一台机器
kubectl get pods --all-namespaces -o wide


//查看端口
[root@master ~]# kubectl get svc --all-namespaces
NAMESPACE              NAME                        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                  AGE
default                kubernetes                  ClusterIP   10.10.0.1      <none>        443/TCP                  25m
kube-system            kube-dns                    ClusterIP   10.10.0.10     <none>        53/UDP,53/TCP,9153/TCP   25m
kubernetes-dashboard   dashboard-metrics-scraper   ClusterIP   10.10.245.95   <none>        8000/TCP                 46s
kubernetes-dashboard   kubernetes-dashboard        NodePort    10.10.43.182   <none>        443:30723/TCP            46s

https://172.16.101.237:30723/

登录,以token的方式登录获取token

kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

修改node主机名

[root@localhost ~]# kubectl get node
NAME                    STATUS   ROLES                  AGE    VERSION
localhost.localdomain   Ready    control-plane,master   140m   v1.20.0
[root@localhost ~]# kubectl delete node localhost.localdomain
node "localhost.localdomain" deleted

//node设置主机名
hostnamectl set-hostname node1

//master设置主机名
hostnamectl set-hostname master

//master node 
kubeadm reset

//再重新执行kubeadm init和kubeadm join操作就可以看到节点成功显示

修改完后访问https://172.16.101.237:30723/

常见错误

[ERROR Port-10259]: Port 10259 is in use

kubeadm reset

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×