简介:
Kubernetes是用于自动部署、扩展和容器化应用程序的开源系统,当使用的容器服务多了,面临的访问量增大后,就需要一种工具把这些容器统一管理起来,需要实现对这些容器的自动部署、扩展和管理,也就是俗称的容器编排,简称为K8S。
1.放行端口
"所有主机"
systemctl stop ufw.service && systemctl disable ufw.service
#采用关闭防火墙 放行所有
2. 禁用交换区
"所有主机"
echo "vm.swappiness=0" >> /etc/sysctl.conf
sysctl -p
#表示禁止使用swap分区,只有当内存或硬盘不够用的时候才会使用这个分区,否则不会去使用。
#将swap开机自动挂载禁用
vim /etc/fstab
# /swap.img none swap sw 0 0、
#临时关闭 查看swap分区大小
swapoff -a
free -m
3. hosts文件 域名通信
"所有主机"
vim /etc/hosts
192.168.117.251 server1
192.168.117.252 server2
#添加对应IP
#或者采用追加方法
echo "192.168.34.2 cncamp.com" >> /etc/hosts
5.为了使Linux节点的iptables能够正确查看桥接流量,请在配置中验证是否将其设置为1。
$ cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
$ cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
$ sudo sysctl --system
6.kubernets自v1.24.0后,就不再使用docker.shim,替换采用containerd
作为容器运行时端点。因此需要安装containerd
(在docker的基础下安装)
6.1 安装一些依赖的系统工具
"all server"
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common'
6.2 添加 Docker 的官方 GPG 密钥
"all server"
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
6.3设置稳定版仓库
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
6.4 安装containerd.io
"all server"
sudo apt-get install containerd.io
7.将containerd用作 CRI (Container Runtime Interface)运行时
7.1将 sandbox_image
镜像源设置为阿里云google_containers
镜像源
"all server"
#生成默认配置
containerd config default > /etc/containerd/config.toml
vim /etc/containerd/config.toml
45 [plugins."io.containerd.grpc.v1.cri"]
61 sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"
#或者
sed -i "s#k8s.gcr.io/pause#registry.aliyuncs.com/google_containers/pause#g" /etc/containerd/config.toml
7.2 配置镜像加速地址
"all server"
#配置containerd镜像加速地址
[plugins."io.containerd.tracing.processor.v1.otlp"]
endpoint = "https://a8x1qfbv.mirror.aliyuncs.com"
insecure = false
protocol = ""
#使用的是镜像加速器服务,阿里云镜像站开通
7.3 配置 cgroup 驱动程序systemd
"all server"
vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
#或者
sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml
7.4 应用所有更改后,重新启动containerd
"all server"
systemctl restart containerd && systemctl enable containerd
netstat -anput | grep containerd
8.安装 kubeadm、kubelet 和 kubectl
kubeadm:用于引导集群的命令。
kubelet:在集群中的所有计算机上运行并执行启动 pod 和容器等操作的组件。(由systemd管理,负责k8s的初始化)
kubectl:用于与集群通信的命令行实用程序。
8.1更新apt软件包索引并安装使用Kubernetes apt存储库所需的软件包:
$ sudo apt-get update
$ sudo apt-get install -y apt-transport-https ca-certificates curl
8.2 安装kubeadm
$ sudo curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
8.3 添加Kubernetes apt存储库
$ sudo tee /etc/apt/sources.list.d/kubernetes.list <<-'EOF'
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
EOF
8.4 安装kubelet, kubeadm and kubectl
$ sudo apt-get update
$ sudo apt-get install -y kubelet kubeadm kubectl
$ sudo apt-mark hold kubelet kubeadm kubectl
8.5 kubeadm init
kubeadm init \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.24.1 \
--pod-network-cidr=10.141.0.0/16 \
--apiserver-advertise-address=10.141.65.188
保存好 kubeadm join 那一行的信息,用于后续加入节点。如果忘记可以用kubeadm token create --print-join-command来生成。
kubeadm join 10.141.65.188:6443 --token f2skts.ziahkdu7ljnw4non \
--discovery-token-ca-cert-hash sha256:241c5573302743f7c7446e7a36c321eee5513ff1767cb3dc0c00b1bcd5201c3d
8.6 复制kubeconfig
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
8.7 Untaint master
查看节点的是否受污染
$ kubectl describe nodes |grep Tain
#或者
$ kubectl get no -o yaml | grep taint -A 5
节点污染,直接删除master节点的污点设置:
$ kubectl taint nodes --all node-role.kubernetes.io/master-
k8s创建pod一直pending
8.8 安装Kunbernets网络插件(calico cni plugin)
$ kubectl create -f https://docs.projectcalico.org/manifests/tigera-operator.yaml
$ kubectl create -f https://docs.projectcalico.org/manifests/custom-resources.yaml
8.9 Node加入集群
kubeadm join 10.141.65.188:6443 --token f2skts.ziahkdu7ljnw4non \
--discovery-token-ca-cert-hash sha256:241c5573302743f7c7446e7a36c321eee5513ff1767cb3dc0c00b1bcd5201c3d
这里需要指定容器运行时的socket路径 默认的话还是回去寻找dockershim
"server2&server3"
kubeadm join 10.141.65.188:6443 --token f2skts.ziahkdu7ljnw4non \
--discovery-token-ca-cert-hash sha256:241c5573302743f7c7446e7a36c321eee5513ff1767cb3dc0c00b1bcd5201c3d --cri-socket=unix:///run/containerd/containerd.sock
8.10 查看pod和nodes的指令
#查看所有的名空间
$ kubectl get pod --all-namespaces
#查看pod的yaml文档
$ kubectl get pod nginx -oymal
#删除pod
$ kubectl delete pods 容器名(NAME)#删掉1/1的容器
#重启pod
$ kubectl get pod {podname} -n {namespace} -o yaml | kubectl replace --force -f -
#查看k8s的master控制面板插件
$ kubectl get pod -n kube-system
#启动etcd
$ kubectl exec -it etcd-cyl sh -n kube-system
#查看节点
$ kubectl get nodes
#查看节点的yaml文档
$ kubectl get node -oyaml
#编辑pod内容
$ kubectl edit po <podName>
#停止k8s,不会启容器了:
$ kubectl drain 10.136.2.73
#启动:
$ kubectl uncordon 10.136.2.73
kubectl常用指令
kubectl get po <podName> /ep <endpoint>/rs<replicaSet> /svc <service> / deploy <deployment>/configMap/secret/ -oyaml -w
#-oyaml 输出详细信息为 yaml 格式。
#-w watch 该对象的后续变化。
#-owide 以详细列表的格式查看对象。
kubectl describe 展示资源的详细信息和相关 Event。
kubectl describe pod <podName>
将pod进行缩容操作 让其为0 即等同于停止操作
$ kubectl scale --replicas=0 deployment/<your-deployment>
Kubectl logs 可查看 pod 的标准输出(stdout, stderr),与 tail 用法类似。
kubectl logs <-f> <podName>
若日志信息存放在pod内,可通过exec查询
kubectl exec -it nginx -- tail -f /root/access.log
kubectl exec 提供进入运行容器的通道,可以进入容器进行 debug 操作。
kubectl exec -it etcd-cyl sh -n kube-system
查看kubectl 提供指令的 长名和短名形式
kubectl api-resources
kubectl expose 创建服务svc对象
kubectl expose deployment <nginx-app> --port=80 --target-port=80
或
kubectl expose deployment <nginx-deployment> selector app=nginx(label) --port=80 --type=NodePort
查看po的label
kubectl get po --show -labels
Kubernetes 通过 Cgroups 提供容器资源管理的功能,可以限制每个容器的CPU 和内存使用
可以通过下面的命令限制nginx 容器最多只用 50% 的 CPU 和 128MB 的内存:
$ kubectl set resources deployment nginx-deployment <deploymentName> -c=nginx --limits=cpu=500m,memory=128Mi
创建configmap对象:
方式一:读取文件的方式,将文件中的内容用于创建configmp
#用于配置的文件
cat game.properties
#configmap from file
kubectl create configmap game-config --from-file=game.properties
kubectl create configmap game-env-config --from-env-file=game.properties
kubectl get configmap -oyaml game-config
方式二:ConfigMap from literal,创建短小内容,直接赋值的configmap
kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm
#-- from-literal=xx 后跟的即是configmap中的data部分
8.11 simple pod demo
Run nginx as webserver
$ kubectl run --image=nginx nginx
$ kubectl run --image=nginx nginx --restart='Always'
Show running pod
$ kubectl get po --show-labels -owide -w
Expose svc
$ kubectl expose deploy nginx --selector run=nginx --port=80 --type=NodePort
Nginx-deployment
Check svc detail
$ kubectl get svc
Access service
$ curl 192.168.34.2:<nodeport>
参考:部署Kubernetes V1.24 集群
9.1 每次执行kubeadm init
初始化k8s集群之前,先执行kubeadm reset
指令,如若不执行,会出现额外的错误比如xxx already exists和Port xxx is in use。
9.2 在执行kubeadm init
时若遇到如下错误:
[ERROR CRI]: container runtime is not running: output: time="2022-05-18T11:36:02+08:00" level=fatal msg="getting status of runtime: rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService"
, error: exit status 1
执行:
rm /etc/containerd/confi
systemctl restart containerd
再次执行kubeadm init
9.3 手动拉取构建
kubeadm init初始化默认从k8s.gcr.io拉取镜像文件,但是国内无法访问k8s.gcr.io,我们可以从阿里云中拉取镜像文件,再改tag成 【k8s.gcr.io/xxxx:版本号】形式。
参考:
Ubuntu18.04搭建k8s集群——kubeadm初始化踩坑记录
kubeadm init初始化k8s集群时报错,[kubelet-check] Initial timeout of 40s passed.
etcdctl --endpoints https://localhost:2379 --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key --cacert /etc/kubernetes/pki/etcd/ca.crt watch --prefix /registry/pods/default/nginx