- K8S
- 1.Kubernetes概述
- 2.K8s特性
- 3.k8s集群构架组件
- 4.K8s集群的核心内容
- 5.搭建K8s集群
- 5.1k8s搭建平台规划
- 5.2环境要求
- 5.3搭建k8s方式
- 5.4k8s集群部署(kubeadm方式)
- 5.5存在的错误及解决方案
1.Kubernetes概述
k8s官网
kubernetes又称k8s,8代表ubernete,谷歌在2014年开业的轻便可扩展的一个开源平台,用于管理云平台的容器化应用和服务,利用kubernetes进行应用扩展,k8s目标的实施让部署容器化应用更加简洁高效
2.K8s特性
- 自动装箱
基于容器对应用的资源配置自动部署
- 自我修复
当容器挂了,会对容器进行重启,当部署的节点有问题时,则会重新部署和调度
当容器没有通过监控配置时,会关闭容器,当能正常开启的时候才会对外提供服务
- 水平扩展
通过命令配置使应用容器进行规模扩大或裁剪,让资源(cpu,内存等)能够合理的分配
- 服务发现
用户不需要知道服务内部发现的机制,采取对外提供统一的路口,基于K8s自身的实现服务和负载均衡 (比如有俩个节点,一个订单一个购物车,访问10次的话,负载均衡会让请求左右各访问5次,进行负载)
- 滚动更新
可以根据应用的变化(比如添加一个功能节点),检查无误了进行一次或批量的更新
- 版本回滚
根据应用部署情况,对历史版本进行回退
- 密钥和配置管理
在不需要重新构建镜像的情况下,可以部署和更新密钥和应用配置,类型热部署
- 存储编排
自动实现存储系统挂载应用,系统储存方式可以是本地目录,网络存储(NFS,GLuster,Ceph等),公共云存储服务
- 批处理
批量数据处理的任务
3.k8s集群构架组件
Master(主控节点)组件
-
Api Server:集群统一入口,以rest ful方式交给etcd存储(分布式键值存储)
-
controller-manager:控制管理,处理集群中常规后台任务,一个资源对应一个控制器
-
scheduler:节点调度,选择node节点应用部署
-
etcd:存储系统,用于保存集群的数据
Node(工作节点):具体工作
- kubelet:master节点派到node节点代表,管理本地容器
- kube-proxy:提高网络代理,负载均衡操作
- docker:容器化操作
4.1Pod
最小部署单元
一组容器集合
共享同一网络
重启立马生成一个新的,生命周期短
4.2controller
确保预期状态下的pod副本数量
无状态部署(没有条件)
有状态部署(有条件的,如:同一ip网络或者存储方式等)
确保所有node运行同一个pod
一次性任务和定时任务
4.3Service
定义一组pod的访问规则,同一通信入口
5.搭建K8s集群 5.1k8s搭建平台规划 5.2环境要求
测试环境要求:
cpu至少2核,内存至少4G,硬盘至少20G
禁止swap分区
所有服务器均可以互通,可以访问外网(拉镜像)
5.3搭建k8s方式5.4k8s集群部署(kubeadm方式)1.kubeadm
kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具,俩条命令完成一个k8s集群的部署,但是不利于排错。
2.二进制包
环境要求:
| 系统 | ip | |
|---|---|---|
| centos8 | 192.168.136.230(k8s-master) | |
| centos8 | 192.168.136.233(k8s-node1) | |
| centos8 | 192.168.136.219(k8s-node2) | |
关闭防火墙
[root@k8s-master ~]# systemctl disable --now firewalld [root@k8s-master ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config [root@k8s-master ~]# setenforce 0 [root@k8s-node2 ~]# systemctl disable --now firewalld [root@k8s-node2 ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config [root@k8s-node2 ~]# setenforce 0 [root@k8s-node1 ~]# systemctl disable --now firewalld [root@k8s-node1 ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config [root@k8s-node1 ~]# setenforce 0
关闭swap(3台均配置)
[root@k8s-master ~]# swapoff -a //临时关闭 [root@k8s-master ~]# vim /etc/fstab //永久关闭 #/dev/mapper/cs_8--4-swap none swap defaults 0 0 [root@k8s-master ~]#sed -ri 's/.*swap.*/#&/' /etc/fstab //永久关闭,俩种方式
master服务器上所有服务器的主机名
[root@k8s-master ~]# cat >> /etc/hosts <将桥接的IPV4流量传递到iptables的链(3台均配置)
cat > /etc/sysctl.d/k8s.conf <时间同步(3台均配置)
yum -y install chrony systemctl enable --now chronydmaster免密登录,确保直接连接管理
ssh-keygen -t rsa ssh-copy-id k8s-node1 ssh-copy-id k8s-node2所有节点安装Docker/kubeadm/kubelet
kubernetes默认是容器运行状态,因此先安装docker
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 systemctl enable --now docker cat > /etc/docker/daemon.json <添加kubernetes阿里云YUM软件源(3台均配置)
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=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安装kubeadm,kubelet和kubectl(3台均配置)
由于版本更新频繁,可以指定稳定版本
kubeadm:引导集群的命令
kubelet:集群中的所有服务器上运行的组件,如启动pod和容器之类的操作
kubectl:用于和你的集群通信的命令行实用程序
yum install -y kubelet-1.20.0 kubeadm-1.20.0 kubectl-1.20.0 systemctl enable kubeletMaster上部署kubernetes
默认拉取镜像地址为k8s.gcr.io国内无法访问,指定阿里云的镜像仓库地址
#192.168.136.230上执行 [root@k8s-master ~]# kubeadm init --apiserver-advertise-address=192.168.122.230 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.20.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16 Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube //此处用于配置kubectl工具 sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.136.230:6443 --token o59qlj.mfkcaw91f7q0o6i0 #用于加入node服务器 --discovery-token-ca-cert-hash sha256:453979b43df91f9973171b166bd8e47c7d6ab4e14d0222dd1e471e93860b3a5f查看拉取的镜像
[root@k8s-master ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry.aliyuncs.com/google_containers/kube-proxy v1.20.0 10cc881966cf 11 months ago 118MB registry.aliyuncs.com/google_containers/kube-scheduler v1.20.0 3138b6e3d471 11 months ago 46.4MB registry.aliyuncs.com/google_containers/kube-apiserver v1.20.0 ca9843d3b545 11 months ago 122MB registry.aliyuncs.com/google_containers/kube-controller-manager v1.20.0 b9fa1895dcaa 11 months ago 116MB registry.aliyuncs.com/google_containers/etcd 3.4.13-0 0369cf4303ff 15 months ago 253MB registry.aliyuncs.com/google_containers/coredns 1.7.0 bfe3a36ebd25 17 months ago 45.2MB registry.aliyuncs.com/google_containers/pause 3.2 80d28bedfe5d 21 months ago 683kB使用kubectl工具
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config [root@k8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master NotReady control-plane,master 5m42s v1.20.0添加Kubernetes Node
在192.168.122.233、192.168.122.219(Node)上执行
[root@k8s-node1 ~]# kubeadm join 192.168.136.230:6443 --token o59qlj.mfkcaw91f7q0o6i0 --discovery-token-ca-cert-hash sha256:453979b43df91f9973171b166bd8e47c7d6ab4e14d0222dd1e471e93860b3a5f [root@k8s-node2 ~]# kubeadm join 192.168.136.230:6443 --token o59qlj.mfkcaw91f7q0o6i0 --discovery-token-ca-cert-hash sha256:453979b43df91f9973171b166bd8e47c7d6ab4e14d0222dd1e471e93860b3a5f#可以看到master已经有了俩node节点 [root@k8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master NotReady control-plane,master 8m8s v1.20.0 k8s-node1 NotReady20s v1.20.0 k8s-node2 NotReady 2s v1.20.0 安装Pod网络插件(CNI)
在master上配置
[root@k8s-master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/documentation/kube-flannel.yml podsecuritypolicy.policy/psp.flannel.unprivileged created clusterrole.rbac.authorization.k8s.io/flannel created clusterrolebinding.rbac.authorization.k8s.io/flannel created serviceaccount/flannel created configmap/kube-flannel-cfg created daemonset.apps/kube-flannel-ds created #查看运行状态 [root@k8s-master ~]# kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE coredns-7f89b7bc75-hl4xt 1/1 Running 0 14m coredns-7f89b7bc75-s2djs 1/1 Running 0 14m etcd-k8s-master 1/1 Running 0 14m kube-apiserver-k8s-master 1/1 Running 0 14m kube-controller-manager-k8s-master 1/1 Running 0 14m kube-flannel-ds-2lptv 1/1 Running 0 113s kube-flannel-ds-cbg9w 1/1 Running 0 113s kube-flannel-ds-sr57d 1/1 Running 0 113s kube-proxy-gwl2p 1/1 Running 0 14m kube-proxy-q92jt 1/1 Running 0 6m37s kube-proxy-q9wlq 1/1 Running 0 6m19s kube-scheduler-k8s-master 1/1 Running 0 14m #节点上的状态 [root@k8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane,master 21m v1.20.0 k8s-node1 Ready13m v1.20.0 k8s-node2 Ready 13m v1.20.0 测试Kubernetes集群
在Kubernetes集群中创建一个pod,验证是否正常运行
#创建一个指定的名称部署 [root@k8s-master ~]# kubectl create deployment nginx --image=nginx deployment.apps/nginx created [root@k8s-master ~]# kubectl expose deployment nginx --port=80 --type=NodePort service/nginx exposed [root@k8s-master ~]# kubectl get pod,svc NAME READY STATUS RESTARTS AGE pod/nginx-6799fc88d8-hnmhs 1/1 Running 0 2m28s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1443/TCP 25m service/nginx NodePort 10.100.203.19 80:32465/TCP 18s web访问
至此部署完成!!
5.5存在的错误及解决方案#kubeadm init初始化部署时长期没响应的话,俩个原因:1.网络问题,docker没有配置加速器 2.k8s的repo文件key开启,版本要求一致 进行重置然后再执行 kubeadm reset
k8s集群部署(二进制基于证书方式)见k8s第二章



