上海做網(wǎng)站優(yōu)化哪家好關(guān)鍵詞工具有哪些
一、資源準(zhǔn)備
mac下虛擬機(jī)環(huán)境搭建
1、使用搜狐的iso源
http://mirrors.sohu.com/centos/7.5.1804/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso
下載 iso鏡像。
2、https://www.macwk.com/soft/vmware?下載 mac vm虛擬機(jī)
3、搭建一主兩從集群所需虛擬機(jī)
4、新建虛擬機(jī)
5、創(chuàng)建自定虛擬機(jī)(先把配置修改好)
6、選擇安裝的linux系統(tǒng)
7、傳統(tǒng)BIOS 引導(dǎo)
8、新建虛擬磁盤(pán)
9、完成 (此時(shí)創(chuàng)建了一個(gè)虛擬機(jī)空殼環(huán)境)
10、調(diào)整配置:
需要先把虛擬機(jī)關(guān)機(jī)
12、選擇iso鏡像文件
然后啟動(dòng)虛擬機(jī)完成安裝。
安裝過(guò)程中自己選擇一些定制化配置,比如以太網(wǎng),配置靜態(tài)ip,要求可以ping通百度
二、集群環(huán)境搭建前準(zhǔn)備
下述所有操作完成后重啟系統(tǒng)即可。
集群中的服務(wù)器都需要進(jìn)行下述配置
1、查看linux系統(tǒng)版本信息
[root@master ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
2、配置主機(jī)名解析,企業(yè)內(nèi)部使用 dns 服務(wù)器, 實(shí)際IP修改為自己機(jī)器的IP即可
[root@master ~]# vim /etc/hosts
192.168.171.2 master
192.168.171.3 node1
192.168.171.4 node2
3、k8s?要求集群中的節(jié)點(diǎn)時(shí)間必須精確一致,可以直接使用 chronyd 服務(wù)從網(wǎng)絡(luò)同步時(shí)間
企業(yè)中建議配置內(nèi)部的時(shí)間同步服務(wù)器? ? ?yum -y install chrony
啟動(dòng) chronyd 服務(wù)
[root@master ~]# systemctl start chronyd
設(shè)置為開(kāi)機(jī)啟動(dòng)
[root@master ~]# systemctl enable chronyd
三臺(tái)服務(wù)都配置好之后 使用 date 驗(yàn)證時(shí)間
[root@master ~]# date[root@k8s-master ~]# systemctl start chronyd && systemctl enable chronyd && date
--- 上述用不了使用 ntp
yum -y install ntp
date
ntpdate time.nist.gov
crontab -e
*/10 * * * * ntpdate time.nist.gov #域名或IP
4、禁用 iptables 和 firewalld 服務(wù) (關(guān)閉防火墻)
k8s?和 docker 運(yùn)行中會(huì)產(chǎn)生大量的 iptabls 規(guī)則。
[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
[root@master ~]# systemctl stop iptables
[root@master ~]# systemctl disable iptables[root@k8s-master ~]# systemctl stop firewalld && systemctl disable firewalld && systemctl stop iptables && systemctl disable iptables
5、禁用 selinux
selinux 是 linux 系統(tǒng)下的一個(gè)安全服務(wù),如果不關(guān)閉它,在安裝集群中會(huì)有各種各樣的問(wèn)題
[root@master ~]# vim /etc/selinux/config
設(shè)置 selinux 值為 disabled
SELINUX=disabled
修改完成后需要重啟linux
6、禁用 swap 分區(qū)
swap 分區(qū)指的是虛擬內(nèi)存分區(qū),它的作用是在物理內(nèi)存使用完之后,將磁盤(pán)空間虛擬成內(nèi)存來(lái)使用
啟用swap設(shè)備會(huì)對(duì)系統(tǒng)的性能產(chǎn)生非常負(fù)面的影響,因此 kubernetes 要求每個(gè)節(jié)點(diǎn)都要禁用swap設(shè)備
但是如果因?yàn)槟承┰虼_實(shí)不能關(guān)閉swap分區(qū),就需要在集群安裝過(guò)程中通過(guò)明確的參數(shù)進(jìn)行配置說(shuō)明
[root@master ~]# vim /etc/fstab
重啟 linux
7、修改 linux 內(nèi)核參數(shù)
[root@master ~]# vim /etc/sysctl.d/kubernetes.conf# 添加下面參數(shù)
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv4.ip_forward=1# 重新加載
[root@master ~]# sysctl -p# 加載網(wǎng)橋過(guò)濾模塊
[root@master ~]# modprobe br_netfilteryum install bridge-utils -y
echo br_netfilter > /etc/modules-load.d/br_netfilter.conf
modprobe br_netfilter
需要重啟生效!!!# 查看網(wǎng)橋過(guò)濾模塊是否加載成功
[root@master ~]# lsmod | grep br_netfilter[root@k8s-master ~]# sysctl -p && modprobe br_netfilter && lsmod | grep br_netfilter
8、配置 ipvs 功能
在 kubernetes 中 service 有兩種代理模型,一種是基于 iptables 的,一種是基于 ipvs 的
兩者比較,ipvs 性能明顯高一些,但是需要使用它,需要手動(dòng)載入 ipvs 模塊
# 安裝 ipset 和 ipvsadmin
[root@master ~]# yum install ipset ipvsadmin -y
# 添加需要加載的模塊寫(xiě)入到腳本文件
[root@master ~]# cat <<EOF>> /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF# 為腳本文件添加執(zhí)行權(quán)限
[root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules# 執(zhí)行腳本文件
[root@master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules# 查看對(duì)應(yīng)模塊是否加載成功
[root@master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
9、上述操作完成后重啟linux系統(tǒng)
三、集群組件安裝
1、安裝 docker
# 切換鏡像源
[root@master ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo# 查看可安裝的包
[root@master ~]# yum list docker-ce —showduplicates# 安裝指定版本的docker —setopt=obsoletes=0 需要指定,否則 yum 會(huì)自動(dòng)安裝更高版本
[root@master ~]# yum -y install --setopt=obsoletes docker-ce-18.06.3.ce-3.el7# 添加一個(gè)配置文件
# docker 默認(rèn)情況下使用的 Cgroup Driver 為 cgroupfs,而 kubernetes 推薦使用 systemd 來(lái)代替 cgroupfs
[root@master ~]# mkdir /etc/docker
[root@master ~]# cat <<EOF>> /etc/docker/daemon.json
{"exec-opts":["native.cgroupdriver=systemd"],"registry-mirrors":["https://kn0t2bca.mirror.aliyuncs.com"]
}
EOFsystemctl daemon-reload# 啟動(dòng)docker
[root@master ~]# systemctl restart docker
[root@master ~]# systemctl enable docker# 驗(yàn)證docker版本
[root@master ~]# docker version
2、安裝 kubernetes 組件
# 切換國(guó)內(nèi)鏡像源
[root@master ~]# vim /etc/yum.repos.d/kubernetes.repo
# 阿里云k8s源
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg# 查看可安裝版本
[root@master ~]# # 安裝 kubeadm kubelet kubect1
[root@master ~]# yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y# 配置 k8s 的 cgroup
[root@master ~]# vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE=“ipvs"# 設(shè)置 kubelet 開(kāi)機(jī)啟動(dòng)
[root@master ~]# systemctl enable kubelet
四、集群安裝
1、準(zhǔn)備 kubernetes 集群鏡像
# 查看需要的鏡像信息
[root@master ~]# kubeadm config images list
# 由于 kubernetes 鏡像國(guó)外源加載慢,所以可以替換鏡像的方式。進(jìn)行快速安裝
# 定義 images
[root@master ~]# images=(
kube-apiserver:v1.17.4
kube-controller-manager:v1.17.4
kube-scheduler:v1.17.4
kube-proxy:v1.17.4
pause:3.1
etcd:3.4.3-0
coredns:1.6.5
)
# 使用docker拉取鏡像
[root@master ~]# for imageName in ${images[@]} ; dodocker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageNamedocker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageNamedocker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done# 查看鏡像信息,驗(yàn)證 tag 是否已經(jīng)與 k8s 組件名稱(chēng)版本映射
[root@node1 ~]# docker images
2、創(chuàng)建集群 這個(gè)初始化只需要在 master 節(jié)點(diǎn)執(zhí)行
[root@master ~]# kubeadm init --kubernetes-version=v1.17.4 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --apiserver-advertise-address=192.168.171.2(你的IP)
3、Your Kubernetes control-plane has initialized successfully! 代表集群master初始化好了
按照說(shuō)明往下執(zhí)行命令
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/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configYou 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 192.168.171.2:6443 --token 2vlxfg.jemb8gja7dvohduc \--discovery-token-ca-cert-hash sha256:c29472cfaa5f84c7178395806480e2fa8225767d720890977481ad11f86839f5
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config# 查看集群節(jié)點(diǎn)信息
[root@master ~]# kubectl get nodes
# 將 nodes 節(jié)點(diǎn)加入到 k8s 集群中
kubeadm join 192.168.171.2:6443 --token 2vlxfg.jemb8gja7dvohduc \--discovery-token-ca-cert-hash sha256:c29472cfaa5f84c7178395806480e2fa8225767d720890977481ad11f86839f5
如果想在 node 節(jié)點(diǎn)執(zhí)行 kubectl get nodes
/etc/kubernetes/admin.conf 拷貝到節(jié)點(diǎn)對(duì)應(yīng)的目錄下。
然后配置 echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
五、集群安裝網(wǎng)絡(luò)插件
kubernetes 支持多種網(wǎng)絡(luò)插件,比如 flannel calico canal 等,任選一種,本次選擇 flannel?
下述操作還是在 master 節(jié)點(diǎn)執(zhí)行即可, 插件使用 DaemonSet 的控制器,會(huì)在每個(gè)節(jié)點(diǎn)上都運(yùn)行
# 哎 一言難盡,或者使用 vim
[root@master ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
or
[root@master ~]# vim kube-flannel.yml
---
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:name: psp.flannel.unprivilegedannotations:seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/defaultseccomp.security.alpha.kubernetes.io/defaultProfileName: docker/defaultapparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/defaultapparmor.security.beta.kubernetes.io/defaultProfileName: runtime/default
spec:privileged: falsevolumes:- configMap- secret- emptyDir- hostPathallowedHostPaths:- pathPrefix: "/etc/cni/net.d"- pathPrefix: "/etc/kube-flannel"- pathPrefix: "/run/flannel"readOnlyRootFilesystem: false# Users and groupsrunAsUser:rule: RunAsAnysupplementalGroups:rule: RunAsAnyfsGroup:rule: RunAsAny# Privilege EscalationallowPrivilegeEscalation: falsedefaultAllowPrivilegeEscalation: false# CapabilitiesallowedCapabilities: ['NET_ADMIN', 'NET_RAW']defaultAddCapabilities: []requiredDropCapabilities: []# Host namespaceshostPID: falsehostIPC: falsehostNetwork: truehostPorts:- min: 0max: 65535# SELinuxseLinux:# SELinux is unused in CaaSPrule: 'RunAsAny'
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: flannel
rules:
- apiGroups: ['extensions']resources: ['podsecuritypolicies']verbs: ['use']resourceNames: ['psp.flannel.unprivileged']
- apiGroups:- ""resources:- podsverbs:- get
- apiGroups:- ""resources:- nodesverbs:- list- watch
- apiGroups:- ""resources:- nodes/statusverbs:- patch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: flannel
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: flannel
subjects:
- kind: ServiceAccountname: flannelnamespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:name: flannelnamespace: kube-system
---
kind: ConfigMap
apiVersion: v1
metadata:name: kube-flannel-cfgnamespace: kube-systemlabels:tier: nodeapp: flannel
data:cni-conf.json: |{"name": "cbr0","cniVersion": "0.3.1","plugins": [{"type": "flannel","delegate": {"hairpinMode": true,"isDefaultGateway": true}},{"type": "portmap","capabilities": {"portMappings": true}}]}net-conf.json: |{"Network": "10.244.0.0/16","Backend": {"Type": "vxlan"}}
---
apiVersion: apps/v1
kind: DaemonSet
metadata:name: kube-flannel-dsnamespace: kube-systemlabels:tier: nodeapp: flannel
spec:selector:matchLabels:app: flanneltemplate:metadata:labels:tier: nodeapp: flannelspec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/osoperator: Invalues:- linuxhostNetwork: truepriorityClassName: system-node-criticaltolerations:- operator: Existseffect: NoScheduleserviceAccountName: flannelinitContainers:- name: install-cniimage: quay.io/coreos/flannel:v0.14.0command:- cpargs:- -f- /etc/kube-flannel/cni-conf.json- /etc/cni/net.d/10-flannel.conflistvolumeMounts:- name: cnimountPath: /etc/cni/net.d- name: flannel-cfgmountPath: /etc/kube-flannel/containers:- name: kube-flannelimage: quay.io/coreos/flannel:v0.14.0command:- /opt/bin/flanneldargs:- --ip-masq- --kube-subnet-mgrresources:requests:cpu: "100m"memory: "50Mi"limits:cpu: "100m"memory: "50Mi"securityContext:privileged: falsecapabilities:add: ["NET_ADMIN", "NET_RAW"]env:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespacevolumeMounts:- name: runmountPath: /run/flannel- name: flannel-cfgmountPath: /etc/kube-flannel/volumes:- name: runhostPath:path: /run/flannel- name: cnihostPath:path: /etc/cni/net.d- name: flannel-cfgconfigMap:name: kube-flannel-cfg# 使用配置文件啟動(dòng) flannel
[root@master ~]# kubectl apply -f kube-flannel.yml
集群網(wǎng)絡(luò)失敗問(wèn)題處理
kubectl get nodes
# 查看是哪個(gè) pod 沒(méi)啟動(dòng)起來(lái)
kubectl get pod -n kube-system
# 查看失敗原因
kubectl describe pod [鏡像名稱(chēng)] -n kube-system
# 手動(dòng)拉取鏡像
docker pull quay.io/coreos/flannel:v0.10.0-amd64
# 修改 tag 與 k8s 對(duì)應(yīng)
docker tag quay.io/coreos/flannel:v0.10.0-amd64 quay.io/coreos/flannel:v0.14.0過(guò)一會(huì)查看 節(jié)點(diǎn)狀態(tài) 都為 Ready 了
六、服務(wù)部署
在 master 節(jié)點(diǎn)操作即可
部署 nginx
[root@master ~]# kubectl create deployment nginx --image=nginx:1.14-alpine
暴露端口
# --type=NodePort 集群之外的應(yīng)用訪(fǎng)問(wèn) 端口為 80
[root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
查看 pod ,service 狀態(tài)
[root@master ~]# kubectl get pod
[root@master ~]# kubectl get service
使用 集群主節(jié)點(diǎn)的ip + 端口進(jìn)行 nginx 訪(fǎng)問(wèn)
192.168.171.2:30324
這是我部署的端口映射
七、資源管理
yaml 2 json 網(wǎng)站:https://www.json2yaml.com/convert-yaml-to-json
1、命令式對(duì)象管理
2、命令式對(duì)象配置
3、聲明式對(duì)象配置