参考资料:k8s基础

k8s 初识

什么是 k8s

  • Kubernetes,简称 K8s ,是用8代替8个字符“ubernete”而成的缩写。Kubernetes是Google开源的一个容器编排引擎,同时也是一个开源的容器集群管理系统,可以实现容器应用的自动化部署、自动扩缩容、监控和维护等功能。
  • Kubernetes具备完善的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建负载均衡器、故障发现和自我修复能力、服务滚动升级和在线扩容、可扩展的资源自动调度机制、多粒度的资源配额管理能力。
  • Kubernetes的目标旨在消除编排物理/虚拟计算、网络和存储基础设施的负担,并使应用程序运营商和开发人员完全将重点放在以容器为中心的原理上进行自助运营。

    k8s框架

    Kubernetes属于主从分布式架构,主要由Master和Node组成,以及包括客户端命令行工具kubectl和其它附加项。

  • Master:作为控制节点,对集群进行调度管理;由kube-apiserver、kube-controller-manager、kube-scheduler、和etcd组成。

    • kube-apiserver:提供了HTTP Rest接口的关键服务进程,是集群里所有资源的增、删、改、查等操作的唯一入口,也是集群的控制入口。
    • kube-controller-manager:运行管理控制器,是集群中处理常规任务的后台进程,每个Controller都负责一种具体的控制流程,而Controller Manager就是这些Controller的核心管理者。
    • kube-scheduler:负责资源调度(Pod调度)的进程,为新创建的Pod选择一个Node节点。
    • etcd:是kubernetes默认的存储系统,集群里所有资源对象的数据全部保存在etcd中。
  • Node:作为工作节点,运行业务应用的容器;由kubelet、kube-proxy和docker(或者rocket)组成。
    • kubelet:负责Pod对应的容器的创建、启停等任务,同时与Master节点密切协作,实现集群管理的基本功能。
    • kube-proxy:实现Kubernetes Service的通信与负载均衡机制的重要组件。
    • docker:容器引擎,负责本机的容器创建和管理工作

image.png

k8s环境配置

网络配置

  • 配置 IP 地址

    1. vim /etc/sysconfig/network-scripts/ifcfg-ens33
    1. TYPE=Ethernet
    2. BOOTPROTO=static
    3. IPADDR=192.168.80.55
    4. PERFIX=24
    5. GATEWAY=192.168.80.2
    6. DNS1=192.168.80.2
    7. NAME=ens33
    8. DEVICE=ens33
    9. ONBOOT=yes
  • 重启网络服务

    1. systemctl restart network
  • 查看设置的 IP是否能够使用

    1. ifconfig
    2. ping www.baidu.com

    image.png

    主机名配置

  • 修改主机名

    1. hostnamectl set-hostname k8s_server
    2. su -
  • 配置主机名解析

    1. vim /etc/hosts
    2. 192.168.80.55 k8s_server
  • 测试主机名解析是否生效

    1. ping k8s_server

    image.png

    防火墙配置

    关闭三个防火墙 iptables、 firewalld 、selinux

  • 关闭 iptables (默认是允许所有)

    1. iptables -F -t filter
    2. iptables -F -t nat
    3. iptables -F -t mangle
  • 关闭 firewalld

    1. 立即关闭:systemctl stop firewalld
    2. 永久关闭:systemctl disable firewalld
  • 关闭 selinux

    1. 立即关闭:setenforce 0
    2. 永久关闭:vim /etc/sysconfig/selinux
    3. SELINUX=disabled
  • 重启系统以生效

    1. shutdown -r now

    配置 yum 源(使用阿里云 yum 源)

  • 新建 /soft 目录,上传阿里云 yum 源(CentOS-Aliyun.repo)

    1. mkdir -p /soft
    2. rz
  • 复制阿里云 yum 源到 yum 源目录

    1. cp /soft/CentOS-Aliyun.repo /etc/yum.repos.d/
  • 清空缓存

    1. yum clean all
  • 重建缓存

    1. yum makecache
  • 系统升级(不会升级内核版本)

    1. yum -y update
  • 添加 etcd 配置文件

    1. mkdir -p /k8s_yaml
    2. cd /k8s_yaml/
  • 配置控制器文件 mysql-dep.yaml

    1. vim mysql-dep.yaml
    1. apiVersion: apps/v1 # apiserver的版本
    2. kind: Deployment # 副本控制器deployment,管理pod和RS
    3. metadata:
    4. name: mysql # deployment的名称,全局唯一
    5. spec:
    6. replicas: 1 # Pod副本期待数量
    7. selector:
    8. matchLabels: # 定义RS的标签
    9. app: mysql # 符合目标的Pod拥有此标签
    10. strategy: # 定义升级的策略
    11. type: RollingUpdate # 滚动升级,逐步替换的策略
    12. template: # 根据此模板创建Pod的副本(实例)
    13. metadata:
    14. labels:
    15. app: mysql # Pod副本的标签,对应RS的Selector
    16. spec:
    17. nodeName: ysp1 # 指定pod运行在的node
    18. containers: # Pod里容器的定义部分
    19. - name: mysql # 容器的名称
    20. image: mysql:5.7 # 容器对应的docker镜像
    21. volumeMounts: # 容器内挂载点的定义部分
    22. - name: time-zone # 容器内挂载点名称
    23. mountPath: /etc/localtime # 容器内挂载点路径,可以是文件或目录
    24. - name: mysql-data
    25. mountPath: /var/lib/mysql # 容器内mysql的数据目录
    26. - name: mysql-logs
    27. mountPath: /var/log/mysql # 容器内mysql的日志目录
    28. ports:
    29. - containerPort: 3306 # 容器暴露的端口号
    30. env: # 写入到容器内的环境容量
    31. - name: MYSQL_ROOT_PASSWORD # 定义了一个mysql的root密码的变量
    32. value: "Java_W_M"
    33. volumes: # 本地需要挂载到容器里的数据卷定义部分
    34. - name: time-zone # 数据卷名称,需要与容器内挂载点名称一致
    35. hostPath:
    36. path: /etc/localtime # 挂载到容器里的路径,将localtime文件挂载到容器里,可让容器使用本地的时区
    37. - name: mysql-data
    38. hostPath:
    39. path: /data/mysql/data # 本地存放mysql数据的目录
    40. - name: mysql-logs
    41. hostPath:
    42. path: /data/mysql/logs # 本地存入mysql日志的目录
  • 配置服务文件 mysql-svc.yaml

    1. vim mysql-svc.yaml
    1. apiVersion: v1
    2. kind: Service
    3. metadata:
    4. name: mysql-service
    5. spec:
    6. type: NodePort
    7. ports:
    8. - port: 3306
    9. targetPort: 3306
    10. nodePort: 30006
    11. selector:
    12. app: mysql

    k8s单机安装

    安装 etcd

  • 安装分布式数据库

    1. yum -y install etcd
  • 检查 etcd 服务是否安装

    1. systemctl list-unit-files | grep etcd
  • 检查 etcd 软件是否安装

    1. rpm -qa | grep etcd

    image.png

    安装k8s

  • 安装 K8s

    1. yum -y install kubernetes
  • 检查 K8s 是否安装

    1. rpm -qa | grep kubernetes

    image.png

  • 检查 K8s 的服务

    1. systemctl list-unit-files | grep kube

    image.png

    关闭交换空间(虚拟内存)

  • 查询交换空间

    1. free -m

    image.png

  • 临时禁用

    1. swapoff -a
  • 永久禁用: 修改配置文件

    1. vim /etc/fstab
    2. # /dev/mapper/centos-swap swap swap defaults 0 0

    安装 rhsm 证书

  • 新建 /soft 目录

    1. mkdir -p /soft
    2. cd /soft
  • 查看是否有 wget 服务

    1. mkdir -p /soft
    2. cd /soft
  • 下载 rhsm 证书

    1. wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
  • 生成证书

    1. rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem
  • 查看证书

    1. rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem

    修改 docker 和 K8s 配置文件

  • 修改 docker 配置文件

    1. vim /etc/sysconfig/docker
    1. # OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'
    2. OPTIONS='--selinux-enabled=false --insecure-registry gcr.io'
    3. if [ -z "${DOCKER_CERT_PATH}" ]; then
    4. DOCKER_CERT_PATH=/etc/docker
    5. fi
  • 修改 K8s 配置文件

    1. cd /etc/kubernetes/vim apiserver
    1. 删除 KUBE_ADMISSION_CONTROL 中的 ServiceAccount
    2. KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"

    启动服务

  • 启动 etcd 服务

    1. systemctl start etcd && systemctl is-active etcd
  • 设置 etcd 开机启动

    1. systemctl start etcd && systemctl is-active etcd
  • 启动 docker 服务

    1. systemctl start docker && systemctl is-active docker
  • 设置 docker 开机启动

    1. systemctl start docker && systemctl is-active docker
  • 启动 kube-apiserver 服务

    1. systemctl start docker && systemctl is-active docker
  • 设置 kube-apiserver 开机启动

    1. systemctl start docker && systemctl is-active docker
  • 启动 kube-controller-manager 服务

    1. systemctl start kube-controller-manager && systemctl is-active kube-controller-manager
  • 设置 kube-controller-manager 开机启动

    1. systemctl enable kube-controller-manager && systemctl is-enabled kube-controller-manager
  • 启动 kube-scheduler 服务

    1. systemctl start kube-scheduler && systemctl is-active kube-scheduler
  • 设置 kube-scheduler 开机启动

    1. systemctl enable kube-scheduler && systemctl is-enabled kube-scheduler
  • 启动 kubelet 服务

    1. systemctl start kubelet && systemctl is-active kubelet
  • 设置 kubelet 开机启动

    1. systemctl enable kubelet && systemctl is-enabled kubelet
  • 启动 kube-proxy 服务

    1. systemctl enable kubelet && systemctl is-enabled kubelet
  • 设置 kube-proxy 开机启动

    1. systemctl enable kubelet && systemctl is-enabled kubelet

    k8s操作

  • 查看 K8s 位置

    1. which kubectl

    image.png

  • 查看 pod 信息

    1. kubectl get pod
  • 显示详细信息(查看的是默认名称空间中的pod信息)

    1. kubectl get pod -o wide
  • 查看特定名称空间中的 pod 信息

    1. kubectl get pod -n namespace
  • 查看 docker 信息

    1. docker version
    2. docker images
    3. docker ps -a
  • 查看布署信息

    1. kubectl get deployment
  • 查看服务的信息

    1. kubectl get service
  • 查看监听的端口

    1. netstat -anlp | grep 443 | grep LISTEN
    2. netstat -anlp | grep 8080 | grep LISTEN
    3. netstat -anlp | grep 6443 | grep LISTEN
  • 修改 kube-apiserver 的监听端口, 监听本机所有IP地址的8080端口

    1. vim /etc/kubernetes/apiserver
    2. KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
    3. # The port on the local server to listen on.
    4. KUBE_API_PORT="--port=8080"
  • 重启 apiserver 服务

    1. systemctl restart kube-apiserver
  • 查看 8080 端口

    1. netstat -anlp | grep 8080 | grep LISTEN
  • 编辑 etcd 配置文件

    1. vim /etc/etcd/etcd.conf
    2. ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
    3. ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"
  • 查看 2379 端口

    1. netstat -anlp | grep 2379 | grep LISTEN
  • 查看 K8s 中的服务

    1. kubectl get svc
    2. kubectl get svc -n namespace

    image.png

  • 查看部署

    1. kubectl get deployment
    2. kubectl get deployment -n namespace
    3. kubectl get deployment -n namespace -o wide