admin管理员组文章数量:1642331
一、准备
服务器准备
服务器 | 功能 | ip | 备注 |
A | 管理节点、工作节点 | 10.10.xx.13x | |
B | 工作节点 | 10.10.xx.23x | |
C | 工作节点 | 10.10.xx.xx |
概念
master
- kubectl:kubectl是kubenetes命令行工具,通过kubectl可以部署和管理应用,查看各种资源,创建,删除和更新组件。
- kubeadm:用于初始化cluster。
node
- Kubelet:运行在cluster所有节点上,负责启动POD和容器。
- Kube-proxy:Service使用其将链接路由到Pod,如上文所述。
- Docker或Rocket:Kubernetes使用的容器技术来创建容器。
- Pod:Pod是一个或多个容器的组合,这些容器共享存储、网络和命名空间,以及如何运行的规范。Pod是Kubernetes的最小可部署单元。Pod的中文译词是豌豆荚,docker容器就像是豆子运行在豌豆荚内。
- ReplicaSet:先说下Replication Controller。Replication Controller的作用是确保Pod以指定的副本个数运行。
ReplicaSet是Replication Controller升级版。ReplicaSet和Replication Controller之间的唯一区别是对选择器支持。Replication Controller只支持基于等式的selector(env=dev或environment!=qa),但ReplicaSet还支持新的,基于集合的selector(version in (v1.0,v2.0)或env notin (dev, qa))。
在yaml文件中通过spec.replicas声明pod的副本数。 - Deployment:Deployment用于管理Pod、ReplicaSet,可实现滚动升级和回滚应用、扩容和缩容。
- Service:试想一个问题,ReplicaSet定义了pod的数量是2,当一个pod由于某种原因停止了,ReplicaSet会新建一个pod,以确保运行中的pod数量始终是2。但每个pod都有自己的ip,前端请求不知道这个新pod的ip是什么,那前端的请求如何发送到新pod中呢?
答案是使用Service。
k8s的Service定义了一个服务的访问入口地址,前端的应用通过这个入口地址访问其背后的一组由Pod副本组成的集群实例,来自外部的访问请求被负载均衡到后端的各个容器应用上。Service与其后端Pod副本集群之间则是通过Label Selector实现关联。
请说人话:前端请求不是直接发送给Pod,而是发送到Service,Service再将请求转发给pod。
总结一下:Pod被ReplicaSet管理,ReplicaSet控制pod的数量;ReplicaSet被Deployment管理,Deployment控制pod应用的升级、回滚,当然也能控制pod的数量。Service提供一个统一固定入口,负责将前端请求转发给Pod。
环境准备
-
借助ntp服务设置各节点的时间同步
yum -y install chrony systemctl start chronyd && systemctl enable chronyd chronyc sources
-
通过DNS完成各节点名称解析,测试环境主机,测试用hosts文件代替(各个节点同步设置)
10.10.10.137 k8s-master01 10.10.10.236 k8s-node01 10.10.10.52 k8s-node02 hostnamectl set-hostname k8s-master01 hostnamectl set-hostname k8s-node01 bash
-
配置ssh免密登入
ssh-keygen -t rsa ssh-copy-id k8s-node01 ssh-copy-id k8s-node02
-
禁用SELinux&禁用Swap设备
swapoff -a && sed -i '/ swap / s/^\\(.*\\)$/#\\1/g' /etc/fstab setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config free -m
-
关闭各节点iptables和firewalld服务(可选择打开端口)
1|k8s master需要开启以下端口
firewall-cmd --permanent --add-port=6443/tcp
firewall-cmd --permanent --add-port=2379-2380/tcp
firewall-cmd --permanent --add-port=10248/tcp
firewall-cmd --permanent --add-port=10249/tcp
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10251/tcp
firewall-cmd --permanent --add-port=10252/tcp
firewall-cmd --permanent --add-port=10255/tcp
firewall-cmd --permanent --add-port=8472/udp
firewall-cmd --permanent --add-port=443/udp
firewall-cmd --permanent --add-port=53/udp
firewall-cmd --permanent --add-port=53/tcp
firewall-cmd --permanent --add-port=9153/tcp
# only if you want NodePorts exposed on control plane IP as well
firewall-cmd --permanent --add-port=30000-32767/tcp
firewall-cmd --add-masquerade --permanent
firewall-cmd --reload
systemctl restart firewalld
2|k8s node需要开启以下端口
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10255/tcp
firewall-cmd --permanent --add-port=8472/udp
firewall-cmd --permanent --add-port=443/udp
firewall-cmd --permanent --add-port=30000-32767/tcp
firewall-cmd --permanent --add-port=53/udp
firewall-cmd --permanent --add-port=53/tcp
firewall-cmd --permanent --add-port=9153/tcp
firewall-cmd --add-masquerade --permanent
systemctl restart firewalld
8472/udp为flannel的通信端口
443/tcp 为Kubernetes server端口
注意一点:一定要执行以下命令打开NAT,默认是关闭状态,这里踩过坑!!
1 2 3 4 5 |
|
如果你使用了istio还有把istio-pilot的端口加到防火墙里:
1 |
|
二、安装
2.1 安装docker
参考docker官网
2.2 部署kubernetes
1、更新yum源(各节点)
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun/kubernetes/yum/doc/rpm-package-key.gpg
EOF
2、安装、开机自启kubelet(各节点)
yum -y install kubelet kubectl kubeadm
systemctl enable kubelet
3、配置Master节点初始化
kubeadm version #查看安装的版本 kubeadm init --kubernetes-version="v1.23.1" --pod-network-cidr=10.80.0.0/16 --image-repository registry.aliyuncs/google_containers #初始化 mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config export KUBECONFIG=/etc/kubernetes/admin.conf
4、在master中安装flannel插入
wget https://raw.githubusercontent/coreos/flannel/master/Documentation/kube-flannel.yml如果wget下载有问题就用其他方法把yml文件下载下来 kubectl apply -f kube-flannel.yml
用kubectl查看状态是否变化为Ready。
kubectl get nodes
5、生成token
#如果过期可先执行此命令
kubeadm token create #重新生成token
#列出token
kubeadm token list | awk -F" " '{print $1}' |tail -n 1
6、获取CA公钥的哈希值
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^ .* //'
7、加入node
kubeadm join k8s-master01:6443 --token qzj6hk.dolv4zlcscqkoc5e --discovery-token-ca-cert-hash sha256:fe8b1ce25d0e121bf874ebfb7353eb5fa8a5531d7aed7aa22b41ef9f5e051ca8
8、查看节点是否加入
kubectl get nodes
9、安装dashboard
kubectl apply -f https://raw.githubusercontent/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml
kubectl proxy --address=192.168.112.38 --disable-filter=true &
http://10.10.10.137:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login
10、安装dashboard
wget https://kuboard/install-script/kuboard.yaml
kubectl apply -f kuboard.yaml
kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep kuboard-user | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d
http://ip:32567/dashboard
FAQ
1、kubelet服务启动失败
注意kubelet的cgroup和docker都设置为systemd
journalctl -f -u kubelet 查看日志发现,报错如下:
kubelet cgroup driver: “cgroupfs” is different from docker cgroup driver: “systemd”
这个里要修改3个配置文件为systemd
1.vim /etc/docker/daemon.json
"exec-opts": ["native.cgroupdriver=systemd"]2.vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
在KUBELET_KUBECONFIG_ARGS 后面追加 --cgroup-driver=systemdEnvironment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --cgroup-driver=systemd"
3.vim /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--cgroup-driver=systemd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs/google_containers/pause:3.2"
systemctl daemon-reload
systemctl restart kubelet
2、master节点可以当node使用
kubectl taint nodes --all node-role.kubernetes.io/master
3、 外部访问dashboard
首先在跳板机上启动 kube-proxy (假设跳板机的 hostname 是
ttg11
):kubectl proxy --address='0.0.0.0' --accept-hosts='^\*$' &
然后本地 ssh 端口转发到跳板机:
ssh -L localhost:8001:localhost:8001 -NT weiping@ttg11然后通过如下本地地址访问:
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/
4、pod在node上创建一直creating
network: failed to set bridge addr: "cni0" already has an IP address
rm -rf /var/lib/cni/ rm -rf /etc/cni/ ifconfig cni0 down ip link delete cni0
5、 pod删除不掉
强制删除
kubectl delete pod -n go-test --force gotest-backend-deployment-6796ccf98c-f65bv
6、Kubernetes对Pod调度指定Node以及Node的Taint 和 Toleration
Kubernetes对Pod调度指定Node以及Node的Taint 和 Toleration_Maxwell_Dncey的博客-CSDN博客_kubectl node taint1.指定pod到指定的node上#1.1查看节点的lebelkubectl get nodes --show-labels#1.2获取到该节点的label信息ip-10-100-2-80 Ready <none> 60d v1.14.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux...https://blog.csdn/weixin_42495873/article/details/103364868
7、k8s集群中node部署下载镜像失败
cp ~/.docker/config.json /var/lib/kubelet/config.json
Images | KubernetesA container image represents binary data that encapsulates an application and all its software dependencies. Container images are executable software bundles that can run standalone and that make very well defined assumptions about their runtime environment.You typically create a container image of your application and push it to a registry before referring to it in a PodThis page provides an outline of the container image concept.Image names Container images are usually given a name such as pause, example/mycontainer, or kube-apiserver.https://kubernetes.io/docs/concepts/containers/images/#configuring-nodes-to-authenticate-to-a-private-repository
8、node打标签做亲和性调度
kubectl label nodes <node-name> <label-key>=<label-value>
9、namespace删不掉
通过命令查看
kubectl edit namespace cert-manager
10、CRD启动失败,调用异常
E0323 07:50:56.028622 1 wrap.go:39] apiserver panic'd on GET /apis/apps.iluvatar.ai/v1/workflows?limit=500&resourceVersion=0
I0323 07:50:56.028691 1 log.go:172] http2: panic serving 10.10.10.137:44722: runtime error: invalid memory address or nil pointer dereference
kubernets版本16.0有问题,16.2+和15.5+修复,或删除[x-kubernetes-int-or-string]
11、dns不通出现pod解析域名错误
dns.resolver.NoNameservers: All nameservers failed to answer the query service-registry.skydiscovery-system. IN A: Server 10.96.0.10 UDP port 53 answered SERVFAIL
flannel模块网络配置问题
kubeadm init --kubernetes-version="v1.15.5" --pod-network-cidr=192.168.0.0/16 --service-cidr=10.96.0.0/12 --image-repository registry.aliyuncs/google_containers
kube-flannel.yml
net-conf.json: |
{
"Network": "192.168.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
本文标签: K8s
版权声明:本文标题:K8s部署实践 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1729335086a1196874.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论