7. K8s

1 安装

1.1 环境准备(所有节点)

1.1.1 设置hosts

vim /etc/hosts
...
172.16.19.53 centos7-wht
172.16.19.55 centos7-wht-2

1.1.2 关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

1.1.3 安装docker

wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io

配置docker的cgroup驱动程序为systemd

vim /etc/docker/daemon.json
{
  ...,
  "exec-opts": ["native.cgroupdriver=systemd"]
}

1.1.4 配置yum源

cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF

1.1.5 关闭SELinux

1.1.6 关闭swap

一次性关闭,重启后失效

swapoff -a

永久关闭,注释掉/etc/fstab中,swap的行

1.1.7 设置iptables

加载br_netfilter模块

modprobe br_netfilter

为了让iptables能够正确地查看桥接流量

cat <  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

1.1.8 配置NetworkManager(可选)

使用Calico 网络插件时,添加如下配置文件
/etc/NetworkManager/conf.d/calico.conf

[keyfile]
unmanaged-devices=interface-name:cali*;interface-name:tunl*;interface-name:vxlan.calico

1.2 Master节点安装kubeadm

1.2.1 安装kubelet 和kubeadm以及kubectl

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

1.2.2 启动docker

systemctl enable docker && systemctl start docker

1.2.3 下载所需要的镜像

for i in `kubeadm config images list`; do 
  imageName=${i##*/}
  docker pull registry.aliyuncs.com/google_containers/$imageName
  if [[ $imageName =~ ^coredns.* ]]
    then
      docker tag registry.aliyuncs.com/google_containers/$imageName k8s.gcr.io/coredns/$imageName
  else
      docker tag registry.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
  fi
  docker rmi registry.aliyuncs.com/google_containers/$imageName
done;

1.2.4 启动kubelet

更改kubelet的参数

vi /etc/sysconfig/kubelet

KUBELET_EXTRA_ARGS=--cgroup-driver=systemd

启动kubelet

systemctl enable --now kubelet

1.2.5 kubeadm初始化

kubeadm init --pod-network-cidr=192.168.0.0/16

如果网段192.168.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
  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 172.16.19.53:6443 --token d9tdc5.mvzocq35mkw4kocp \
    --discovery-token-ca-cert-hash sha256:4167f0435d466c721bf8d9bfba9c0ff1f85350c2349fd097407300d8b4982ff1

按照提示,执行如下命令

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

root用户执行如下命令

  export KUBECONFIG=/etc/kubernetes/admin.conf

node节点可以运行命令来加入集群,有效期2个小时

kubeadm join 172.16.19.53:6443 --token d9tdc5.mvzocq35mkw4kocp \
    --discovery-token-ca-cert-hash sha256:4167f0435d466c721bf8d9bfba9c0ff1f85350c2349fd097407300d8b4982ff1

1.2.6 安装网络插件

kubectl create -f https://docs.projectcalico.org/manifests/tigera-operator.yaml
kubectl create -f https://docs.projectcalico.org/manifests/custom-resources.yaml

如果不使用默认的192.168.0.0/16网段,可以先将custom-resources.yaml下载下来,更改配置后安装

1.2.7 修改kube-scheduler的监控端口

修改/etc/kubernetes/manifests/kube-controller-manager.yaml/etc/kubernetes/manifests/kube-scheduler.yaml,注释掉- --port=0的一行

sed -i 's/- --port=0/#- --port=0/g' /etc/kubernetes/manifests/kube-controller-manager.yaml
sed -i 's/- --port=0/#- --port=0/g' /etc/kubernetes/manifests/kube-scheduler.yaml

systemctl restart kubelet

1.2.8 让Master也能跑Pod(可选)

kubectl taint nodes --all node-role.kubernetes.io/master-

恢复

kubectl taint node node名字 node-role.kubernetes.io/master="":NoSchedule

1.3 node节点安装kubeadm

1.3.1 安装kubeadm kubelet

yum -y install kubeadm kubelet --disableexcludes=kubernetes

1.3.2 启动docker

systemctl enable docker && systemctl start docker

1.3.3 下载所需镜像

以下脚本为下载最新镜像,worker节点的镜像版本需要和master节点保持一致

for i in `kubeadm config images list`; do 
  imageName=${i##*/}
  docker pull registry.aliyuncs.com/google_containers/$imageName
  if [[ $imageName =~ ^coredns.* ]]
    then
      docker tag registry.aliyuncs.com/google_containers/$imageName k8s.gcr.io/coredns/$imageName
  else
      docker tag registry.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
  fi
  docker rmi registry.aliyuncs.com/google_containers/$imageName
done;

1.3.4 更改kubelet参数

更改kubelet的参数

vi /etc/sysconfig/kubelet

KUBELET_EXTRA_ARGS=--cgroup-driver=systemd
systemctl start kubelet.service

1.3.5 加入master

kubeadm join 172.16.19.53:6443 --token d9tdc5.mvzocq35mkw4kocp \
    --discovery-token-ca-cert-hash sha256:4167f0435d466c721bf8d9bfba9c0ff1f85350c2349fd097407300d8b4982ff1

2 k8s组件

Control Plane:协调集群中的所有活动,例如调度应用、维护应用的所需状态、应用扩容以及推出新的更新。
Node:是一个虚拟机或者物理机,它在 Kubernetes 集群中充当工作机器的角色。
Pod:Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。Pod 类似于共享名字空间和文件系统卷的一组 Docker 容器。
Kubectl:管理 Kubernetes 集群的命令行工具
Namespace:资源分组,不同的Namespace下面可以有相同的名字,进行kubectl操作不指定namespace时默认在default下,可以使用-n参数指定namespace。K8s的公共服务组件在kube-system这个namespace下。

2.1 控制平面组件

2.1.1 kube-scheduler

调度器,负责监视新创建的、未指定运行节点node的Pods,选择node节点让 Pod 在上面运行。
调度决策考虑的因素包括单个 Pod 和 Pod 集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰和最后时限。

2.1.2 kube-controller-manager

检测Node节点状态,当Node节点down时,负责将Pod在别的Node拉起。

2.1.3 kube-apiserver

API server 是控制平面的前端,用于接收Kubectl发来的请求,向后控制kube-scheduler,和kube-controller-manager

2.1.4 etcd

兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。kube-apiserver的所有指令操作也会记录在etcd中。

2.2 Node 组件

2.2.1 kubelet

kubelet 是在每个 Node 节点上运行的主要 “节点代理”,向 apiserver 注册,接收apiserver的命令,负责维护容器生命周期(控制容器运行环境),同时也负责Volume(CVI)和网络(CNI)的管理

2.2.2 kube-proxy

在Node节点上运行的网络代理,用于实现Pods之间或Pods与外网的网络通信。

2.2.3 容器运行环境

Docker, containerd, CRI-O等能够创建和管理容器的软件

2.3 控制平面组件参数修改

使用 kubeadm 安装 Kubernetes 的集群,apiserverschedulercontroller-manageretcd 通过 static pod 启动,其 yaml 文件的位置在/etc/kubernetes/manifests/,kubelet 会监控该目录下文件的变动,只要发生变化,pod 就会重建,响应相应的改动。

例子:调整nodePort的范围,默认是30000-32767
编辑/etc/kubernetes/manifests/kube-apiserver.yaml文件,在command 下添加 --service-node-port-range=20000-65535 参数,修改后会自动生效

apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubeadm.kubernetes.io/kube-apiserver.advertise-address.endpoint: 172.16.19.53:6443
  creationTimestamp: null
  labels:
    component: kube-apiserver
    tier: control-plane
  name: kube-apiserver
  namespace: kube-system
spec:
  containers:
  - command:
    - kube-apiserver
    - --advertise-address=172.16.19.53
    - --service-node-port-range=20000-65535

3 kubectl基础命令

3.1 配置命令自动补全

首先安装bash-completion

yum -y install bash-completion

配置kubectl命令自动补全,对当前shell生效

source <(kubectl completion bash)

kubectl命令自动补全写入bash启动文件,永久生效

kubectl completion bash > ~/.kube/completion.bash.inc
printf "
# Kubectl shell completion
source '$HOME/.kube/completion.bash.inc'
" >> $HOME/.bash_profile
source $HOME/.bash_profile

3.2 查询node节点

kubectl get nodes

输出如下

NAME            STATUS   ROLES                  AGE     VERSION
centos7-wht     Ready    control-plane,master   30h     v1.22.2
centos7-wht-2   Ready                     4m42s   v1.22.2

3.3 获得join命令参数

kubeadm token create --print-join-command

输出如下

kubeadm join 172.16.19.53:6443 --token hr6yol.4m7jqak5vgjx93as --discovery-token-ca-cert-hash sha256:4167f0435d466c721bf8d9bfba9c0ff1f85350c2349fd097407300d8b4982ff1

3.4 查询master组件状态

kubectl get cs

输出如下

NAME                 STATUS    MESSAGE                         ERROR
scheduler            Healthy   ok
controller-manager   Healthy   ok
etcd-0               Healthy   {"health":"true","reason":""}

3.5 查询网络组件的状态

watch kubectl get pods -n calico-system

3.6 创建或升级资源

kubectl create或apply -f yaml文件

区别如下

序号 kubectl apply kubectl create
1 根据yaml文件中包含的字段(yaml文件可以只写需要改动的字段),直接升级集群中的现有资源对象 首先删除集群中现有的所有资源,然后重新根据yaml文件(必须是完整的配置信息)生成新的资源对象
2 yaml文件可以不完整,只写需要的字段 yaml文件必须是完整的配置字段内容
3 kubectl apply只工作在yaml文件中的某些改动过的字段 kubectl create工作在yaml文件中的所有字段
4 在只改动了yaml文件中的某些声明时,而不是全部改动,你可以使用kubectl apply 在没有改动yaml文件时,使用同一个yaml文件执行命令kubectl replace,将不会成功(fail掉),因为缺少相关改动信息

3.7 在线编辑资源

kubectl edit 资源类型 资源名称

3.8 查询详细信息

kubectl describe 资源类型 名字

例子

# 查询1个节点
kubectl describe nodes centos7-wht
# 查询1个pod
kubectl describe pods nginx-prczd

3.9 进入Pod

kubectl exec -it Pod名字 -- 执行的命令
例子

kubectl exec -it nginx-bckrx -- bash

3.10 查询资源yaml语法

kubectl explain pod/svc/rc...
例子

# 查询service资源spec字段的语法
kubectl explain service.spec
# 查询service资源service.spec.sessionAffinityConfig.clientIP字段的语法
kubectl explain service.spec.sessionAffinityConfig.clientIP

3.11 查询资源的yaml配置文件

kubectl get pod/svc/rs/deployment... 资源名字 -o yaml

3.12 查询pod的日志

kubectl logs [-f] [-p] POD名字 [-c CONTAINER]

参数解释

  -c, --container="": 容器名。
  -f, --follow[=false]: 指定是否持续输出日志。
      --interactive[=true]: 如果为true,当需要时提示用户进行输入。默认为true。
      --limit-bytes=0: 输出日志的最大字节数。默认无限制。
  -p, --previous[=false]: 如果为true,输出pod中曾经运行过,但目前已终止的容器的日志。
      --since=0: 仅返回相对时间范围,如5s、2m或3h,之内的日志。默认返回所有日志。只能同时使用since和since-time中的一种。
      --since-time="": 仅返回指定时间(RFC3339格式)之后的日志。默认返回所有日志。只能同时使用since和since-time中的一种。
      --tail=-1: 要显示的最新的日志条数。默认为-1,显示所有的日志。
      --timestamps[=false]: 在日志中包含时间戳。

你可能感兴趣的:(7. K8s)