部署sock-shop备忘录
清除环境
如果以前没有安装过Docker、Kubernetes及相关内容的可以略过,本章用于清除原有的安装文件。
删除已经部署内容
kubectl get nodes #查看当前部署
kubectl get nodes -owde #查看更多当前部署的信息,包括内部ip的分配
kubectl delete nodes node-1 #删除node-1,有多的结点可以按此依次删除
先work结点后master结点进行reset操作,注意按照提示删除相关内容,随后reboot
kubeadm reset #每个node中操作
在所有服务器上删除软件
#1 -qa代表query all,| 上一条命令的输出作为小一条命令的输入,grep查找文件里符合条件的字符串
rpm -qa|grep xxx
#2 查找系统中的docker安装包
dpkg -l | grep docker
dpkg -l | grep kube*
#3 集中删除,删除后可以运行2看是否清除干净
for d in `dpkg -l|grep docker`;do apt remove --purge $d;done
for k in `dpkg -l|grep kube*`;do apt remove --purge $d;done
参考内容:
准备工作
服务器命名
#分别对服务器按照主节点和工作节点命名
hostnamectl set-hostname master
或 hostnamectl set-hostname node1
#查看服务器名称
hostname
修改host
#在主结点和工作结点分别修改hosts文件,使内网ip同名称对应
vim /etc/hosts
192.168.0.234 node1
192.168.0.56 master
#修改完成后可以使用ping node1或ping master来测试是否连接
关闭所有结点SELinux
(ubuntu好像没有)
参考:关闭selinux
# Centos中 所有节点关闭 SELinux
setenforce 0
sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
关闭所有结点防火墙
(云服务器中默认关闭)
systemctl stop firewalld
systemctl disable firewalld
关闭所有结点swap交换
我在华为云上通过free -m
已经全是0,并且找不到fstab文件,遂没有管。
这个
swap
其实可以类比成 windows 上的虚拟内存,它可以让服务器在内存吃满的情况下可以保持低效运行,而不是直接卡死。但是 k8s 的较新版本都要求关闭swap
。
#临时关闭swap
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 7983 1129 5459 92 1394 6445
Swap: 0 0 0
[root@localhost ~]#
swapoff -a
free -m
#注释掉/etc/fstab里关于SWAP文件系统的挂载信息
#永久关闭swap
sudo vi /etc/fstab
#将下列内容注释掉,随后reboot,通过top指令查看任务管理器,swap后均为0表示关闭
UUID=e2048966-750b-4795-a9a2-7b477d6681bf / ext4 errors=remount-ro 0 1
# /dev/fd0 /media/floppy0 auto rw,user,noauto,exec,utf8 0 0
参考:
Docker
安装
国内服务器建议直接按照清华镜像安装Docker进行安装。
#清除老版本
sudo apt-get remove docker docker-engine docker.io containerd runc
#更新apt并且安装部分软件
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
#添加docker官方GPG密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
#设置库,国外的库
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
#安装docker,安装指定版本看下一条
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
#安装指定版本,例如5:20.10.16~3-0~ubuntu-jammy,将VERSION_STRING进行更改
apt-cache madison docker-ce
sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io docker-compose-plugin
#测试是否安装正确
sudo docker run hello-world
参考:
Install Docker Engine on Ubuntu | Docker Documentation
配置
通过修改daemon.json
来修改配置
1、按需求切换到国内镜像;
2、修改cgroups。
cgroups 是Linux内核提供的一种可以限制单个进程或者多个进程所使用资源的机制,可以对 cpu,内存等资源实现精细化的控制,目前越来越火的轻量级容器 Docker 就使用了 cgroups 提供的资源限制能力来完成cpu,内存等部分的资源控制。但是k8s使用设置为systemed,为避免出现异常,我们需要将Docker也改为systemed。
sudo vi /etc/docker/daemon.json
#修改镜像及隔离程序
{
"registry-mirrors": [
"https://dockerhub.azk8s.cn",
"https://reg-mirror.qiniu.com",
"https://quay-mirror.qiniu.com"
],
"exec-opts": [ "native.cgroupdriver=systemd" ]
}
#保存后重启
sudo systemctl daemon-reload
sudo systemctl restart docker
#查看docker cgroup状态,显示为systemed即可
docker info | grep Cgroup
Kubernetes
安装
#更新apt并使其支持ssl传输且安装相关软件
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
#下载Google Cloud public signing key
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
#添加k8s的apt库
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
#使用apt安装,第三行为指定版本安装,最新版1.24有些许改动,推荐先使用1.23版
sudo apt-get update
#sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-get install -y kubelet=1.23.1-00 kubectl=1.23.1-00 kubeadm=1.23.1-00
sudo apt-mark hold kubelet kubeadm kubectl
国内
# 使得 apt 支持 ssl 传输
apt-get update && apt-get install -y apt-transport-https
# 下载 gpg 密钥
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
# 添加 k8s 镜像源
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
# 更新源列表
apt-get update
# 下载 kubectl,kubeadm以及 kubelet
#apt-get install -y kubelet kubeadm kubectl
sudo apt-get install -y kubelet=1.23.1-00 kubectl=1.23.1-00 kubeadm=1.23.1-00
参考:三.安装K8s
初始化
在主节点运行初始化,服务器网络允许也可以不添加后面的image
# 初始化集群控制台 Control plane
# 失败了可以用 kubeadm reset 重置
kubeadm init --image-repository=registry.aliyuncs.com/google_containers
成功后在最后两行出现kubeadm join
命令,可以先拷贝下来
# k8s加node,忘记了重新获取:kubeadm token create --print-join-command
kubeadm join 192.168.0.56:6443 --token 457bze.urarc8t6znoul0gw \
--discovery-token-ca-cert-hash #sha256:8eeeba9d026f37e30352cc6954da84d2aa00bb7e7c980c41ec6ab13e548df032
复制授权文件(有很多错误是由于admin.conf产生的,该文件会在init后生成)
#复制授权文件,以便 kubectl 可以有权限访问集群
#如果你其他节点需要访问集群,需要从主节点复制这个文件过去其他节点
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
在工作节点运行join
命令
kubeadm join 192.168.0.56:6443 --token 457bze.urarc8t6znoul0gw \
--discovery-token-ca-cert-hash
安装网络插件flannel,以解决node为NotReady状态
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
最后通过kubectl get nodes
查看节点状态,至此集群搭建完成。
参考:
扩展:
k8s(Kubernetes)中Pod,Deployment,ReplicaSet,Service之间关系分析 : deploy控制RS,RS控制Pod,这一整套,向外提供稳定可靠的Service
Sock-shop
#拉取与安装
git clone https://github.com/microservices-demo/microservices-demo.git
cd microservices-demo/deploy/kubernetes/
kubectl create namespace sock-shop
kubectl apply -f complete-demo.yaml
#查看pod情况
get pod --namespace=sock-shop
#等所有pods准备好以后,可以尝试部署prometheus
cd /deploy/kubernetes/manifests-monitoring/
kubectl create -f 00-monitoring-ns.yaml
kubectl apply $(ls *-prometheus-*.yaml | awk ' { print " -f " $1 } ')
图片使用kubectl get pod -A
查看所有pod
参考:
Sock-shop安装教程及唐学长整理文档
错误
the connect to the server XXX:6443 was refused
#查看docker.service状态
systemctl status docker.service
#查看日志
journalctl -xefu kubelet
cgroup设置问题,上文中有提到
flannel显示为CrashLoopBackOf
部署flannel网络插件时发现flannel一直处于CrashLoopBackOff状态,查看日志提示没有分配cidrhttps://blog.csdn.net/anqixiang/article/details/107715591
k8s常用命令
#k8s查看某一pod状态
#kubectl describe pods pod的名称 -n pod所在namespace
kubectl describe pods carts-76dd6bf8f9-vzwk8 -n sock-shop
#查看命名空间
kubectl get namespaces
#所有pod的状态
kubectl get pods -A
#查看k8s容器的服务清单
kubectl get pods -n ${命名空间名} -o wide
#查看pod日志
kubectl logs pod_name
kubectl log -f ${podID} -n ${命名空间名}
#将namespace从default切换到sock-shop
kubectl config set-context $(kubectl config current-context) --namespace=sock-shop