运维实战 容器部分 Kubernetes集群部署

简介

Kubernetes来源于Borg, 对计算资源进行了更高层次的抽象, 通过将容器进行细致的组合, 将最终的应用服务交给用户.与Docker相比, k8s的组件选择更为灵活, 可以按照业务需求对组件进行更替.

优势

  • 隐藏资源管理和错误处理, 用户仅需要关注应用的开发
  • 具有高可用 高可靠的特性
  • 可以运行在由成千上万的机器联合而成的集群中, 进而平坦负载

image-20210506022352499

Kubernetes集群包含有节点代理kubeletMaster组件(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	提供集群日志采集, 存储与查询

image-20210506022431391

核心层对外提供API构建高层的应用, 对内提供插件式应用执行环境

应用层用于部署(无状态应用, 有状态应用, 批处理任务, 集群应用等)和路由(服务发现, DNS解析等)

管理层提供系统度量(如基础设施, 容器和网络的度量), 自动化(如自动扩展, 动态Provision等)以及策略管理(RBAC, Quota, PSP, NetworkPolicy等)

接口层负责kubectl命令行工具 客户端SDK以及集群联邦等等服务

安装部署

  • 前期准备
    关闭节点的selinuxiptables防火墙
##所有节点部署docker引擎
yum install -y docker-ce docker-ce-cli

vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

sysctl --system

systemctl enable docker
systemctl start docker


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"
  ]
}

mkdir -p /etc/systemd/system/docker.service.d

systemctl daemon-reload
systemctl restart docker

##禁用swap分区
swapoff -a
注释掉/etc/fstab文件中的swap定义

安装部署软件kubeadm/kubelet/kubectl
yum install -y kubelet kubeadm kubectl

##更改源为阿里云(这里出现了包的问题,采用私有仓库解决了)
##默认从k8s.gcr.io上下载组件镜像
vim /etc/yum.repos.d/k8s.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0

systemctl enable --now kubelet

##查看默认配置信息
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
##初始化集群
kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository registry.aliyuncs.com/google_containers


##可能附加的参数
##使用flannel网络组件时添加
--pod-network-cidr=10.244.0.0/16
##指定k8s安装版本
--kubernetes-version

##节点扩容
kubeadm join --token b3a32e.7cef20447b55261e 172.25.0.11:6443 --discovery-token-ca-cert-hash sha256:bc718df41fdceb0db6c5380c7e27c204589b41dcb5f9a3bc52c254b707377f2f

##配置kubectl
useradd kubeadm

vim /etc/sudoers
kubeadm  ALL=(ALL)       NOPASSWD: ALL

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

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

##安装flannel网络组件
##https://github.com/coreos/flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

##其他网络组件
https://kubernetes.io/zh/docs/concepts/cluster-administration/addons/

##Master查看状态:
kubectl get cs
kubectl get node
kubectl get pod -n kube-system

##kubectl命令指南
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands

##对其他节点的操作
[root@Server2 mnt]# scp /etc/yum.repos.d/k8s.repo Server3:/etc/yum.repos.d/
k8s.repo                                      100%  129   119.2KB/s   00:00    
[root@Server2 mnt]# scp /etc/yum.repos.d/k8s.repo Server4:/etc/yum.repos.d/
k8s.repo                                      100%  129   125.1KB/s   00:00    
[root@Server2 mnt]# ssh Server3 yum install -y kubelet kubeadm kubectl
[root@Server2 mnt]# ssh Server4 yum install -y kubelet kubeadm kubectl
[root@Server2 mnt]# systemctl enable --now kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
[root@Server2 mnt]# kubeadm config print init-defaults
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 1.2.3.4
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: node
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {
   }
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: 1.21.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
scheduler: {
   }
[root@Server2 mnt]# kubeadm config images list --image-repository registry.aliyuncs.com/google_containers
registry.aliyuncs.com/google_containers/kube-apiserver:v1.21.0
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.21.0
registry.aliyuncs.com/google_containers/kube-scheduler:v1.21.0
registry.aliyuncs.com/google_containers/kube-proxy:v1.21.0
registry.aliyuncs.com/google_containers/pause:3.4.1
registry.aliyuncs.com/google_containers/etcd:3.4.13-0
registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0

image-20210430164911554

至此, 简单的部署完成了.

需要注意的是的:

  • K8S的拖取策略为always, 每次启动时都会与仓库比对软件版本
  • 因此每次启动集群时应该默认先启动仓库所在的主机, 否则会出现报错等问题
  • 控制节点默认不参与工作
  • 初始化节点时生成的token默认有效时间为24小时, 24小时token失效, 无法用于添加新节点
kubeadm token list			列出有效token
kubeadm token create		创建新的token

Pod管理

  • Pod是可以创建和管理k8s计算的最小可部署单元, 一个pod代表集群中运行的一个进程, 每个pod都有一个唯一的IP.

  • 一个pod可以包含一个或多个容器(通常是Docker), 多个容器间共享IPC, NetworkUTC namespace.

虽然可以通过kubectl命令行方式来操作, 但通常还是推荐使用资源清单的方式.

kubectl get默认查看的是defaultnamespace中的信息, 通过指定namespace可以指定查看的信息.

Pod分为自主式Pod由控制器控制的Pod

kubectl delete pod [名称]可以删除自主式Pod, 但有控制器的Pod是无法被直接删除的.

##创建自主式Pod
[root@Server2 mnt]# kubectl run nginx --image=nginx
pod/nginx created
##查看Pod情况
[root@Server2 mnt]# kubectl get pod -o wide
NAME    READY   STATUS              RESTARTS   AGE   IP       NODE      NOMINATED NODE   READINESS GATES
nginx   0/1     ContainerCreating   0          2s    <none>   server3   <none>           <none>
[root@Server2 mnt]# kubectl get pod -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP           NODE      NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          73s   10.244.1.2   server3   <none>           <none>

##测试Pod内nginx是否可用
[root@Server2 mnt]# curl 10.244.1.2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
   
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

##删除自主式Pod并检测
[root@Server2 mnt]# kubectl delete pod nginx 
pod "nginx" deleted
[root@Server2 mnt]# kubectl get pod -o wide
No resources found in default namespace.

Service

Service 是一个较为抽象的概念, 可以认为其被用于定义服务.

  • 一个服务可以具有多个Pod
  • 多个Pod作为一个逻辑整体为业务服务
  • Service还定义了访问其中Pod的策略, 因此也常被成为微服务
  • Service对其后端的Pod具有探针检测

交互式创建Service

kubectl expose deployment nginx --port=80 --target-port=80

此时Pod客户端可以通过Service名称访问后端的两个Pod

两种网络类型

类型 特点
ClusterIP 默认类型, 自动分配一个仅集群内部可以访问的虚拟IP
NodePort ClusterIP基础上为Service在每台机器上绑定一个端口, 这样就可以通过NodeIP:NodePort来访问该服务

通过使用NodePort类型暴露端口的方式, 可以让外部客户端访问Pod

##修改service的type为NodePort
kubectl edit svc nginx

##在创建service时指定类型
kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort

Pod扩容与缩容

kubectl scale --replicas=6 deployment nginx

kubectl scale --replicas=3 deployment nginx

更新Pod镜像

kubectl set image deployment nginx nginx=nginx:1.16.0 --record

Pod回滚

##查看历史版本
kubectl rollout history deployment nginx

##版本回滚
kubectl rollout undo deployment nginx --to-revision=1

资源清单

一般来说遵循如下格式

apiVersion: group/version				指明api资源属于哪个群组和版本, 同一个组可以有多个版本
kind:									标记创建的资源类型, k8s主要支持以下资源类别
										Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet,Job,Cronjob
metadata:								元数据
  name:									对像名称
  namespace:							对象属于哪个命名空间
  labels:								指定资源标签, 标签是一种键值数据
spec:									定义目标资源的期望状态
  • 相关命令
##查询命令
kubectl api-versions
##查询Pod的帮助文档
kubectl explain pod
##查看Pod的标签
kubectl get pod --show-labels
##过滤含有app标签的Pod
kubectl get pod -l app
kubectl get pod -L app
##附加标签
kubectl label pod demo version=v1
##更改标签
kubectl label pod demo app=nginx --overwrite

##节点标签选择器
kubectl label nodes server2 disktype=ssd
##筛选节点标签
kubectl get nodes -l disktype
  • 在资源清单中附加标签选择器

image-20210517181155260

帮助信息中常见格式如下: 
apiVersion <string>  			表示字符串类型
metadata <Object>  				表示需要嵌套多层字段
labels <map[string]string>  	表示由k:v组成的映射
finalizers <[]string>  			表示字串列表
ownerReferences <[]Object>  	表示对象列表
hostPID <boolean>  				布尔类型
priority <integer>  			整型
name <string> -required-  		如果类型后面接 -required-, 表示为必填字段

Pod生命周期

Pod可以包含多个容器, 应用运行在这些容器里面, 同时Pod也可以有一个或多个先于应用容器启动的Init 容器

Init容器的特点

  • 总时运行到完成
  • 不支持Readiness探针, 因为它们必
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值