参考资料: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:容器引擎,负责本机的容器创建和管理工作
k8s环境配置
网络配置
配置 IP 地址
vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=static
IPADDR=192.168.80.55
PERFIX=24
GATEWAY=192.168.80.2
DNS1=192.168.80.2
NAME=ens33
DEVICE=ens33
ONBOOT=yes
重启网络服务
systemctl restart network
查看设置的 IP是否能够使用
ifconfig
ping www.baidu.com
主机名配置
修改主机名
hostnamectl set-hostname k8s_server
su -
配置主机名解析
vim /etc/hosts
192.168.80.55 k8s_server
测试主机名解析是否生效
ping k8s_server
防火墙配置
关闭三个防火墙 iptables、 firewalld 、selinux
关闭 iptables (默认是允许所有)
iptables -F -t filter
iptables -F -t nat
iptables -F -t mangle
关闭 firewalld
立即关闭:systemctl stop firewalld
永久关闭:systemctl disable firewalld
关闭 selinux
立即关闭:setenforce 0
永久关闭:vim /etc/sysconfig/selinux
SELINUX=disabled
重启系统以生效
shutdown -r now
配置 yum 源(使用阿里云 yum 源)
新建 /soft 目录,上传阿里云 yum 源(CentOS-Aliyun.repo)
mkdir -p /soft
rz
复制阿里云 yum 源到 yum 源目录
cp /soft/CentOS-Aliyun.repo /etc/yum.repos.d/
清空缓存
yum clean all
重建缓存
yum makecache
系统升级(不会升级内核版本)
yum -y update
添加 etcd 配置文件
mkdir -p /k8s_yaml
cd /k8s_yaml/
配置控制器文件 mysql-dep.yaml
vim mysql-dep.yaml
apiVersion: apps/v1 # apiserver的版本
kind: Deployment # 副本控制器deployment,管理pod和RS
metadata:
name: mysql # deployment的名称,全局唯一
spec:
replicas: 1 # Pod副本期待数量
selector:
matchLabels: # 定义RS的标签
app: mysql # 符合目标的Pod拥有此标签
strategy: # 定义升级的策略
type: RollingUpdate # 滚动升级,逐步替换的策略
template: # 根据此模板创建Pod的副本(实例)
metadata:
labels:
app: mysql # Pod副本的标签,对应RS的Selector
spec:
nodeName: ysp1 # 指定pod运行在的node
containers: # Pod里容器的定义部分
- name: mysql # 容器的名称
image: mysql:5.7 # 容器对应的docker镜像
volumeMounts: # 容器内挂载点的定义部分
- name: time-zone # 容器内挂载点名称
mountPath: /etc/localtime # 容器内挂载点路径,可以是文件或目录
- name: mysql-data
mountPath: /var/lib/mysql # 容器内mysql的数据目录
- name: mysql-logs
mountPath: /var/log/mysql # 容器内mysql的日志目录
ports:
- containerPort: 3306 # 容器暴露的端口号
env: # 写入到容器内的环境容量
- name: MYSQL_ROOT_PASSWORD # 定义了一个mysql的root密码的变量
value: "Java_W_M"
volumes: # 本地需要挂载到容器里的数据卷定义部分
- name: time-zone # 数据卷名称,需要与容器内挂载点名称一致
hostPath:
path: /etc/localtime # 挂载到容器里的路径,将localtime文件挂载到容器里,可让容器使用本地的时区
- name: mysql-data
hostPath:
path: /data/mysql/data # 本地存放mysql数据的目录
- name: mysql-logs
hostPath:
path: /data/mysql/logs # 本地存入mysql日志的目录
配置服务文件 mysql-svc.yaml
vim mysql-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql-service
spec:
type: NodePort
ports:
- port: 3306
targetPort: 3306
nodePort: 30006
selector:
app: mysql
k8s单机安装
安装 etcd
安装分布式数据库
yum -y install etcd
检查 etcd 服务是否安装
systemctl list-unit-files | grep etcd
检查 etcd 软件是否安装
rpm -qa | grep etcd
安装k8s
安装 K8s
yum -y install kubernetes
检查 K8s 是否安装
rpm -qa | grep kubernetes
检查 K8s 的服务
systemctl list-unit-files | grep kube
关闭交换空间(虚拟内存)
查询交换空间
free -m
临时禁用
swapoff -a
永久禁用: 修改配置文件
vim /etc/fstab
# /dev/mapper/centos-swap swap swap defaults 0 0
安装 rhsm 证书
新建 /soft 目录
mkdir -p /soft
cd /soft
查看是否有 wget 服务
mkdir -p /soft
cd /soft
下载 rhsm 证书
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
生成证书
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
查看证书
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 配置文件
vim /etc/sysconfig/docker
# OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'
OPTIONS='--selinux-enabled=false --insecure-registry gcr.io'
if [ -z "${DOCKER_CERT_PATH}" ]; then
DOCKER_CERT_PATH=/etc/docker
fi
修改 K8s 配置文件
cd /etc/kubernetes/vim apiserver
删除 KUBE_ADMISSION_CONTROL 中的 ServiceAccount
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
启动服务
启动 etcd 服务
systemctl start etcd && systemctl is-active etcd
设置 etcd 开机启动
systemctl start etcd && systemctl is-active etcd
启动 docker 服务
systemctl start docker && systemctl is-active docker
设置 docker 开机启动
systemctl start docker && systemctl is-active docker
启动 kube-apiserver 服务
systemctl start docker && systemctl is-active docker
设置 kube-apiserver 开机启动
systemctl start docker && systemctl is-active docker
启动 kube-controller-manager 服务
systemctl start kube-controller-manager && systemctl is-active kube-controller-manager
设置 kube-controller-manager 开机启动
systemctl enable kube-controller-manager && systemctl is-enabled kube-controller-manager
启动 kube-scheduler 服务
systemctl start kube-scheduler && systemctl is-active kube-scheduler
设置 kube-scheduler 开机启动
systemctl enable kube-scheduler && systemctl is-enabled kube-scheduler
启动 kubelet 服务
systemctl start kubelet && systemctl is-active kubelet
设置 kubelet 开机启动
systemctl enable kubelet && systemctl is-enabled kubelet
启动 kube-proxy 服务
systemctl enable kubelet && systemctl is-enabled kubelet
设置 kube-proxy 开机启动
systemctl enable kubelet && systemctl is-enabled kubelet
k8s操作
查看 K8s 位置
which kubectl
查看 pod 信息
kubectl get pod
显示详细信息(查看的是默认名称空间中的pod信息)
kubectl get pod -o wide
查看特定名称空间中的 pod 信息
kubectl get pod -n namespace
查看 docker 信息
docker version
docker images
docker ps -a
查看布署信息
kubectl get deployment
查看服务的信息
kubectl get service
查看监听的端口
netstat -anlp | grep 443 | grep LISTEN
netstat -anlp | grep 8080 | grep LISTEN
netstat -anlp | grep 6443 | grep LISTEN
修改 kube-apiserver 的监听端口, 监听本机所有IP地址的8080端口
vim /etc/kubernetes/apiserver
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
# The port on the local server to listen on.
KUBE_API_PORT="--port=8080"
重启 apiserver 服务
systemctl restart kube-apiserver
查看 8080 端口
netstat -anlp | grep 8080 | grep LISTEN
编辑 etcd 配置文件
vim /etc/etcd/etcd.conf
ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379"
查看 2379 端口
netstat -anlp | grep 2379 | grep LISTEN
查看 K8s 中的服务
kubectl get svc
kubectl get svc -n namespace
查看部署
kubectl get deployment
kubectl get deployment -n namespace
kubectl get deployment -n namespace -o wide