Kubernetes集群部署、Pod管理

Kubernetes

简介

  • 在Docker 作为高级容器引擎快速发展的同时,在Google内部,容器技术已经应用了很多年,Borg系统运行管理着成千上万的容器应用。

  • Kubernetes项目来源于Borg,可以说是集结了Borg设计思想的精华,并且吸收了Borg系统中的经验和教训。

  • Kubernetes对计算资源进行了更高层次的抽象,通过将容器进行细致的组合,将最终的应用服务交给用户。

  • Kubernetes的好处:
    1.隐藏资源管理和错误处理,用户仅需要关注应用的开发
    2.服务高可用、高可靠。
    3.可将负载运行在由成千上万的机器联合而成的集群中。

设计架构

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以及集群联邦
  • 生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范

    Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等
    Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身
    的配置和管理等Kubernetes部

Kubernetes部署

参考官方文档:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/

实验环境:
server1(做为maste):172.25.1.1 ,4G运行内存,2个CPU
server2:172.25.1.2, 2G运行内存,2个CPU
server3:172.25.1.3 ,2G运行内存,2个CPU
harbor仓库:172.25.1.11

1.在server1/2/3上安装docker引擎

yum insatll -y containerd.io-1.2.13-3.2.el7.x86_64.rpm container-selinux-2.77-1.el7.noarch.rpm docker-ce-19.03.11-3.el7.x86_64.rpm docker-ce-cli-19.03.11-3.el7.x86_64.rpm

安装docker
vim /etc/sysctl.d/k8s.conf

net.bridge.bridge-nf-call-ip6tables = 1 
net.bridge.bridge-nf-call-iptables = 1 

sysctl --system
systemctl daemon-reload重载配置
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"  
  ] 
}

systemctl enable docker --now设置docker开机自启

2.所有集群节点禁用swap分区:

[root@server1 ~]# swapoff -a
[root@server1 ~]# vim /etc/fstab ##注释掉/etc/fstab文件中的swap定义 
[root@server1 ~]# tail -1 /etc/fstab 
#UUID=2a714265-f92d-4429-87da-9f09e32e6ff2 swap                    swap    defaults        0 0

3.所有节点安装Kubernetes
vim /etc/yum.repos.d/k8s.repo配置Kubernetes的yum源

[kubernetes] 
name=Kubernetes 
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ 
enabled=1 
gpgcheck=0 

yum install -y kubelet kubeadm kubectl安装Kubernetes
systemctl enable --now kubelet设置Kubernetes开启自启
kubeadm config print init-defaults查看默认配置信息
kubeadm config images list --image-repository registry.aliyuncs.com/google_containers 列出所需镜像
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers 拉取镜像
注意:默认从k8s.gcr.io上下载组件镜像,需要翻墙才可以,所以需要修改镜像仓库

for i in `docker images | grep aliyuncs| awk '{print $1":"$2}' | awk -F / '{print $3}'`;do docker tag registry.aliyuncs.com/google_containers/$i reg.red.org/library/$i ; done ##修改镜像标签
for i in `docker images | grep red`;do docker push  reg.red.org/library/$i; done ##上传镜像到harbor仓库

4.配置kubectl命令补齐功能:

echo "source <(kubectl completion bash)" >> ~/.bashrc 配置kubectl命令补齐功能
source .bashrc

5.在master端初始化集群
kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository reg.personal.org/library 在k8s集群主机(server1)初始化集群

 --pod-network-cidr=10.244.0.0/16 ##使用flannel网络组件时必须添加
 --kubernetes-version //指定k8s安装版本

注意:token有时效24h,超过24后需要生成新的token
kubeadm token create生成新的token
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \ openssl dgst -sha256 -hex | sed 's/^.* //'查看哈希码

在master端配置kubectl
useradd kubeadm
visudo

kubeadm ALL=(ALL)       NOPASSWD: ALL

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown ( i d − u ) : (id -u): (idu):(id -g) $HOME/.kube/config

查看集群节点:

kubectl get node

6.在节点端配置节点扩容
kubeadm join 192.168.43.11:6443 --token u6t3zu.35njbfulasgvuj0n --discovery-token-ca-cert-hash sha256:74eba2d1eb6e2d5e408b0e75c2a4d95d99bcf2ff8875bfdf5f9c77df72e196d0在节点端设置

kubectl get node在master端查看节点

7.安装flannel网络组件
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
注意:master要配置及部署文件kube-fannel.ym,所有节点都要配置仓库的地址解析,及flannel软件组
kubectl get pod --all-namespaces查看状态,必须所有组件running

kubectl命令指南: • https://kubernetes.io/docs/reference/generated/kubectl/kubectlcommands
Master查看状态:
kubectl get cs
kubectl get node
kubectl get pod -n kube-system
kubectl get pod -o wide -n kube-system查看每个节点的部署内容
8.节点的删除与恢复
在master端删除现存的工作节点
kubectl drain server3 --delete-local-data --force --ignore-daemonsets(删除工作中的节点)
kubectl delete node server3
kubeadm reset对于非正常加入的节点,在节点端reset(清除加入时的信息)

Pod管理

  • Pod是可以创建和管理Kubernetes计算的最小可部署单元,一个Pod代表着集群中运行的一个进程,每个pod都有一个唯一的ip。一个pod类似一个豌豆荚,包含一个或多个容器(通常是docker),多个容器间共享IPC、Network和UTC namespace。

1.相关配置

kubectl命令:https://kubernetes.io/docs/reference/generated/kubectl/kubectlcommands
1.配置每个节点的私有仓库,及每个节点都有证书
在server2与server3上:
vim /etc/docker/daemon.json

{
    
      
  "registry-mirrors": ["https://reg.personal.org"], ##添加私有仓库
  "exec-opts": ["native.cgroupdriver=systemd"],  
  "log-driver": "json-file",  
  "log-opts": {
    
        
    "max-size": "100m"  
  },  
  "storage-driver": "overlay2",  
  "storage-opts": [    
    "overlay2.override_kernel_check=true"  
  ] 
}

systemctl restart docker重启docker引擎

cd /etc/docker/certs.d
ls
reg.personal.org
cd reg.personal.org
ls
ca.crt

2.创建自主式pod

# docker load -i nginx.tar
$ kubectl run nginx --image=nginx --replicas=2 --record
$ kubectl get pod查看pod的运行状态
$ kubectl get pod -o wide查看pod的运行位置
$ kubectl logs demo查看日志输出
$ kubectl describe pod demo查看pod的详细信息
注意:集群内部任意节点可以访问Pod,但集群外部无法直接访问。

3.使用控制器部署pod+删除pod

$ kubectl create deployment myapp --image=nginx使用控制器部署pod
这种方式创建集群删除后会自动拉起
$ kubectl delete pod myapp-687598b8b4-ch84w删除pod
$ kubectl delete deployment.apps myapp彻底删除

4.Pod扩容与缩容

$ kubectl create deployment myapp --image=nginx
$ kubectl scale deployment myapp --replicas=2
$ kubectl scale deployment myapp --replicas=5手动扩容
$ kubectl scale deployment myapp --replicas=2手动缩容

5.service设定

service是一个抽象概念,定义了一个服务的多个pod逻辑合集和访问pod的策略, 一般把service称为微服务。
创建service:
$ kubectl expose deployment nginx --port=80 --target-port=80 此时pod客户端可以通过service的名称访问后端的两个Pod
ClusterIP: 默认类型,自动分配一个仅集群内部可以访问的虚拟IP

kubectl expose deployment myapp --port=80 --target-port=80暴露端口
kubectl get svc查看service
kubectl describe svc myapp
kubectl get pod -o wide
kubectl get pod --show-labels

6.pod镜像更新和回滚

更新pod镜像 $ kubectl set image deployments myapp nginx=myapp:v1 --record
查看历史版本 $ kubectl rollout history deployment nginx
回滚版本 $ kubectl rollout undo deployment myapp --to-revision=2

7.使用NodePort类型暴露端口,让外部客户端访问Pod

$ kubectl edit svc myapp 修改service的type为NodePort
$ kubectl expose deployment nginx --port=80 --target-port=80 -type=NodePort 也可以在创建service时指定类型
NodePort: 在ClusterIP基础上为Service在每台机器上绑定一个端口,这样就可以通过NodeIP:NodePort 来访问该服务

猜你喜欢

转载自blog.csdn.net/Thorne_lu/article/details/106826851