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 的集群,apiserver
、scheduler
、controller-manager
、etcd
通过 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]: 在日志中包含时间戳。