一、环境部署
此次考试使用的是v1.22版本,由于有升级考题,所以先安装v1.21版本
安装方式:kubeadmin 安装最低配置:2C/2G
ip | 主机名 | 操作系统 | 配置 | 角色 |
---|---|---|---|---|
192.168.248.120 | k8s-master | Centos7.9 | 2C/4G | master |
192.168.248.121 | k8s-node01 | Centos7.9 | 2C/4G | node1 |
192.168.248.122 | k8s-node02 | Centos7.9 | 2C/4G | node2 |
1.系统初始化
在三台机器执行以下操作
-
修改hosts
cat >> /etc/hosts <<EOF 192.168.248.120 k8s-master 192.168.248.121 k8s-node01 192.168.248.122 k8s-node02 EOF
-
关闭防火墙和selinux
# 关闭防火墙 systemctl stop firewalld systemctl disable firewalld # 关闭selinux: setenforce 0 # 临时 sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
-
关闭swap
swapoff -a # 临时 sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
-
同步时间
# 同步系统时间(可以访问外网才能同步,如果没有外网请使用其它方式同步。如内网时间服务器): yum install ntpdate -y # 安装ntpdate命令 ntpdate time.windows.com # time.windows.com为时间服务器地址,可以根据需求更换为别的地址 # 如果服务器时区不对,可以修改一下 timedatectl set-timezone 'Asia/Shanghai'
-
修改主机名
# 120执行 hostnamectl set-hostname k8s-master # 121执行 hostnamectl set-hostname k8s-node01 # 122执行 hostnamectl set-hostname k8s-node02 # 修改完成后查看 hostname
-
配置yum源
rm -rf /etc/yum.repos.d/* # 使用阿里源 wget -O /etc/yum.repos.d/CentOS7-Aliyun.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 安装依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 # 设置docker源 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 设置kubernetes源 cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF
-
修改内核参数
cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF # 生效 sysctl --system
-
安装docker
yum install docker-ce -y # 不指定版本安装的是最新版本 # 如果安装别的版本可以指定版本,如 yum -y install docker-ce-18.06.1.ce-3.el7 # 安装完成后启动,并加入开机启动 systemctl start docker && systemctl enable docker # 启动完成后查看 docker info # 配置docker mkdir -p /etc/docker cat > /etc/docker/daemon.json << EOF { "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"] } EOF # 重启 systemctl restart docker
-
所有节点安装软件包
# 如果不指定版本会安装最新的版本,这里先安装1.21版本后面再进行升级 yum install -y kubelet-1.21.1-0 kubeadm-1.21.1-0 kubectl-1.21.1-0 # 启动kubelet并设置开机启动 systemctl restart kubelet; systemctl enable kubelet
2. 安装master
master节点操作
-
执行初始化
执行中会报
coredns
找不到的错误,以下是解决方法# 拉取镜像 docker pull coredns/coredns:1.8.0 # 修改tag docker tag coredns/coredns:1.8.0 registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0
执行初始化命令
kubeadm init --kubernetes-version=1.21.1 --apiserver-advertise-address=120.48.66.186 --image-repository registry.aliyuncs.com/google_containers --service-cidr=10.244.0.0/16 --pod-network-cidr=10.244.0.0/16
参数说明:
-
--kubernetes-version:k8s版本
-
--apiserver-advertise-address:apiserver的地址
-
--image-repository :指定下载地址为阿里云
-
--kubernetes-version=1.21.1 :指定安装版本为1.21.1
-
pod-network-cidr :指定pod的网段
如果执行报错,执行一下命令重置:
kubeadm reset systemctl daemon-reload systemctl restart kubelet iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X iptables -nL #检查防火墙规则是否清空 netstat -antlp #检查端口是否全被放开
安装过程跟网速有关,镜像比较大,可能会比较慢,可以新打开一个窗口查看镜像下载情况:
docker images
以下是执行成功的提示
-
-
复制配置文件
安装提示步骤执行即可
mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
3. node节点加入集群
以下步骤在node节点执行
分别在两个node节点执行以下命令(此语句是执行完init后提示的语句,不要直接复制下面的语句)
kubeadm join 192.168.248.120:6443 --token hur3eq.c5s9ui4j4qr3vrxe \ --discovery-token-ca-cert-hash sha256:f8cf3fc549f6d0816dd656062ce1b18cbadc16cdd44ac77ff174a10d64ac796c
如果提示错误:[ERROR Port-10250]: Port 10250 is in use
在此节点执行重置命令:kubeadm reset
重新执行kubeadm join
以下是执行成功截图
两台都执行完成kubeadm join
后切换到master节点执行:
kubectl get nodes # 执行结果节点状态为:NotReady,这是正常的因为没有安装网络插件
4.安装calico网络插件
在kubernetes集群中,pod是分配在不同的节点上的,为了实现这些pod跨主机访问通信,需要安装CNI插卡,这里使用calico
以下步骤在master节点执行
-
下载安装文件
wget https://docs.projectcalico.org/v3.19/manifests/calico.yaml --no-check-certificate
-
修改配置
打开配置文件,查找"192",去掉注释然后把网段改为之前init时
pod-network-cidr
配置的网段地址注意:这里一定要注意格式,- name 、value要和下面的name、value对齐
vim calico.yaml # 查找修改 - name: CALICO_IPV4POOL_CIDR value: "10.244.0.0/16"
-
部署
# 执行部署命令 kubectl apply -f calico.yaml
-
测试
执行完成后部署后,如果没有报错,可以查看镜像下载情况,镜像文件比较大也需要等待一会
docker images |grep calico
查看calico pod状态
kubectl get pod -n kube-system |grep calico
pod状态都为Running后,再次查看节点,状态是否为Ready
kubectl get nodes
5. 安装后的设置
-
kubectl命令补全
集群安装完成后kubectl命令都是在master节点执行。但是有个缺点就是kubectl不能按Tab键进行补全,这里需要设置一下:
yum install bash-completion source <(kubectl completion bash) # 在 bash 中设置当前 shell 的自动补全,要先安装 bash-completion 包。 echo "source <(kubectl completion bash)" >> ~/.bashrc # 在您的 bash shell 中永久的添加自动补全
6.删除节点
有时需要把集群中某个节点移除
下面演示如何把node02从集群中移除
-
驱逐节点
# 获取节点名 kubectl get nodes # 驱逐节点,设置不可调度并驱逐节点上 Pod kubectl drain k8s-node02 --ignore-daemonsets
如果报错可以根据提示再加上选项
kubectl drain k8s-node01 --ignore-daemonsets --delete-local-data --force
-
改为可调度
如果想把驱除的节点改为可调度
kubectl uncordon k8s-node02
7. 常用命令
-
查看集群信息
# 查看集群信息 kubectl cluster-info
# 查看kubernetes版本 kubectl version # 精简输出 kubectl version --short
-
查看kubernetes支持的api版本
kubectl api-versions
8.监控资源
考试和日常使用中都会涉及查看pod或节点资源情况,需要安装监控。
这里使用metric-server进行演示
-
安装
以下操作在master节点执行
# 下载,如果github访问不了,可以试试git加速 wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.5.2/components.yaml
修改配置文件:
vim metrics-server-deployment.yaml
修改内容:
# 镜像地址 image: k8s.gcr.io/metrics-server/metrics-server:v0.5.2 # 改为 image: registry.aliyuncs.com/google_containers/metrics-server:v0.5.2 # 删掉 ExternalIP,Hostname这两个,这里已经改好了,你那边要自己核对一下 - --kubelet-preferred-address-types=InternalIP # 加上 - --kubelet-insecure-tls
完整的yaml文件:
apiVersion: v1 kind: ServiceAccount metadata: labels: k8s-app: metrics-server name: metrics-server namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: labels: k8s-app: metrics-server rbac.authorization.k8s.io/aggregate-to-admin: "true" rbac.authorization.k8s.io/aggregate-to-edit: "true" rbac.authorization.k8s.io/aggregate-to-view: "true" name: system:aggregated-metrics-reader rules: - apiGroups: - metrics.k8s.io resources: - pods - nodes verbs: - get - list - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: labels: k8s-app: metrics-server name: system:metrics-server rules: - apiGroups: - "" resources: - pods - nodes - nodes/stats - namespaces - configmaps verbs: - get - list - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: labels: k8s-app: metrics-server name: metrics-server-auth-reader namespace: kube-system roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: extension-apiserver-authentication-reader subjects: - kind: ServiceAccount name: metrics-server namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: labels: k8s-app: metrics-server name: metrics-server:system:auth-delegator roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:auth-delegator subjects: - kind: ServiceAccount name: metrics-server namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: labels: k8s-app: metrics-server name: system:metrics-server roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:metrics-server subjects: - kind: ServiceAccount name: metrics-server namespace: kube-system --- apiVersion: v1 kind: Service metadata: labels: k8s-app: metrics-server name: metrics-server namespace: kube-system spec: ports: - name: https port: 443 protocol: TCP targetPort: https selector: k8s-app: metrics-server --- apiVersion: apps/v1 kind: Deployment metadata: labels: k8s-app: metrics-server name: metrics-server namespace: kube-system spec: selector: matchLabels: k8s-app: metrics-server strategy: rollingUpdate: maxUnavailable: 0 template: metadata: labels: k8s-app: metrics-server spec: containers: - args: - --cert-dir=/tmp - --secure-port=4430 - --kubelet-preferred-address-types=InternalIP - --kubelet-insecure-tls - --kubelet-use-node-status-port - --metric-resolution=15s image: registry.aliyuncs.com/google_containers/metrics-server:v0.5.2 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 3 httpGet: path: /livez port: https scheme: HTTPS periodSeconds: 10 name: metrics-server ports: - containerPort: 4430 name: https protocol: TCP readinessProbe: failureThreshold: 3 httpGet: path: /readyz port: https scheme: HTTPS initialDelaySeconds: 20 periodSeconds: 10 resources: requests: cpu: 100m memory: 200Mi securityContext: readOnlyRootFilesystem: true runAsNonRoot: true runAsUser: 1000 volumeMounts: - mountPath: /tmp name: tmp-dir nodeSelector: kubernetes.io/os: linux priorityClassName: system-cluster-critical serviceAccountName: metrics-server volumes: - emptyDir: {} name: tmp-dir --- apiVersion: apiregistration.k8s.io/v1 kind: APIService metadata: labels: k8s-app: metrics-server name: v1beta1.metrics.k8s.io spec: group: metrics.k8s.io groupPriorityMinimum: 100 insecureSkipTLSVerify: true service: name: metrics-server namespace: kube-system version: v1beta1 versionPriority: 100
执行部署:
kubectl apply -f components.yaml
查看是否启动
kubectl get pod -n kube-system |grep metric
-
查看node节点负载
查看,并对内存排序
kubectl top node --sort-by="memory" // --sort-by="memory" 表示根据内存排序
查看,并CPU排序
kubectl top node --sort-by='cpu'
-
查看pod负载
查看,并CPU排序
kubectl top pod --sort-by='cpu' -A //-A 表示所有的表空间
查看,并内存排序
kubectl top pod --sort-by='memory' -A
二、升级K8S
之前部署的k8s版本为1.21,此次考试使用的版本是1.22这里模拟升级到1.22版本
注意:
-
考试使用的是ubuntu系统,升级方式有些不同。
-
k8s不能跨级升级
-
此方式只适合于kubeadm方式安装的集群
1. 升级master
-
升级kubeadm
# 驱逐master节点 kubectl drain k8s-master --ignore-daemonsets # 查看节点是否驱逐 kubectl get node # 升级kubeadm到1.22.1 yum install -y kubeadm-1.22.1-0 # 查看版本 kubeadm version # 命令查看是否可以升级 kubeadm upgrade plan # 执行升级命令 kubeadm upgrade apply v1.22.1 // 执行会提示“y/N”
执行成功会提示
[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.22.1". Enjoy!
升级kubelet和kubectl
# 安装 yum install -y kubelet-1.22.1-0 kubectl-1.22.1-0 --disableexcludes=kubernetes # 重启 systemctl daemon-reload systemctl restart kubelet # 查看版本 kubectl version --short
# 取消驱逐 kubectl uncoredn k8s-master
如果集群还有其他的master节点,升级步骤和上述一致,但是需要把
kubeadm upgrade apply v1.22.1
换成kubeadm upgrade node
2.升级节点机
升级步骤和master几点一致,先把节点设置为维护模式(驱逐节点),然后升级kubeadm,再升级kubectl和kubelet
在另外两台节点机执行以下步骤:
注意驱逐在master节点执行,并需要修改节点名称
# 在master节点执行:驱逐node1,如果是node2改下名字即可 kubectl drain k8s-node01 --ignore-daemonsets # 查看节点是否驱逐 kubectl get node # 在两台节点升级kubeadm到1.22.1 yum install -y kubeadm-1.22.1-0 # 查看版本 kubeadm version # 执行升级命令 kubeadm upgrade node
# 更新kubelet和kubectl yum install -y kubelet-1.22.1-0 kubectl-1.22.1-0 --disableexcludes=kubernetes # 重启 systemctl daemon-reload systemctl restart kubelet
在master节点取消两台机器驱逐
kubectl uncordon k8s-node01 kubectl uncordon k8s-node02 # 查看节点信息 kubectl get node
三. 部署Dashboard
Dashboard是k8s的一个web页面,不部署也可以。
# 应用部署文件 kubectl apply -f kubernetes-dashboard.yaml # 查看状态 kubectl get pod,svc -n kubernetes-dashboard
访问页面:https://NodeIP:30001
NodeIP是指随意一个node服务器ip,如:
创建service account并绑定默认cluster-admin管理员集群角色:
kubectl create serviceaccount dashboard-admin -n kube-system kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
执行完复制token
粘贴并登陆:
登陆后的页面: