Google Cloud에서 Kubernetes 엔진과 클라우드 SQL을 사용하여 Wordpress 등 상태 애플리케이션을 적절히 확장
8227 단어 devopscloudwordpresskubernetes
그래서 내가 직면한 문제는 고도로 확장 가능한wordpress 설정이 필요하다는 것이다. 이것이 바로 내가 생각한 것이다.
상태 있는 응용 프로그램을 확장하는 것이 왜 이렇게 어렵습니까?
이 프로그램들은 CD에 직접 쓰는데, 대부분의 경우 그것을 막을 수 없다.이것은 특정 플러그인 시스템을 사용하는 PHP 기반 응용 프로그램에서 자주 나타난다.따라서 파일은 특정한 유형의 저장소에 저장할 수 없고 응용 프로그램의 파일 시스템에 저장해야 한다.
지금은 비슷한 것을 말할 수 있지만, 클라우드 저장소에 쓸 수 있는 무상태 플러그인 https://de.wordpress.org/plugins/wp-stateless/ 이 있다.네, 이것은 정말입니다. 그러나 플러그인이나 파일을 저장하지 않습니다. 일부 플러그인은 그곳의 폴더에 직접 쓰일 수 있습니다. (불행히도 이런 상황이 발생했지만 사실입니다)
어떡하지?
우리는 확장 가능한 데이터베이스가 필요하고, 응용 프로그램과 응용 프로그램 자체에 사용할 공유 파일 라이브러리가 필요합니다.
시간을 줄이기 위해서, 우리는 미리 정의된 Wordpress Docker 이미지만 사용할 것입니다. 이 Docker 파일에 필요한 추가 내용을 만들려고 시도해야 하지만.그것들을 기초로 삼아라, 그러나 너의 필요까지 확장해야 한다.
그래서 우리는 공유 CD가 필요하다. 여기서 우리는 첫 번째 문제에 부딪혔다.우리 Kubernetes 집단에 ReadWriteMany 볼륨이 필요하면 문제가 시작됩니다.클라우드 공급자는 이 기능을 가지고 있지 않다.
검사하는 경우 the Kubernetes documentation
GCEPersistantDsik, AzureDisk 및 AWSElasticBlockStore는 우리가 필요로 하는 기능을 지원하지 않습니다.
Goolge Cloud의 CloudFileStore나 AzureFile 같은 옵션이 있지만, 우리의 사례에 있어서는 매우 비싸고 크다. (우리의 Wordpress를 저장하기 위해 1TB가 필요하지 않습니다.)
NFS 구조
그러나 우리가 이 명단을 보았을 때, 우리는 구세주: NFS의 구조를 보았다.NFS에 연결할 ReadWriteOnce 스토리지가 있는 유일한 옵션을 만듭니다.따라서 지역 간에 공유할 수 있는 이상적인 저장 클래스가 필요합니다.
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: regionalpd-storageclass
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-standard
replication-type: regional-pd
zones: europe-west3-b, europe-west3-c
우리는 대량 클레임을 만들어야 한다apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
storageClassName: ""
volumeName: nfs
이제 NFS를 만듭니다.apiVersion: v1
kind: Service
metadata:
name: nfs-server
spec:
clusterIP: 10.3.240.20
ports:
- name: nfs
port: 2049
- name: mountd
port: 20048
- name: rpcbind
port: 111
selector:
role: nfs-server
이제 NFS 자체를 추가합니다.좋습니다. 우리는 미리 정의된 서비스를 사용할 수 있습니다.apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nfs-server
spec:
replicas: 1
selector:
matchLabels:
role: nfs-server
template:
metadata:
labels:
role: nfs-server
spec:
containers:
- name: nfs-server
image: gcr.io/google_containers/volume-nfs:0.8
ports:
- name: nfs
containerPort: 2049
- name: mountd
containerPort: 20048
- name: rpcbind
containerPort: 111
securityContext:
privileged: true
volumeMounts:
- mountPath: /exports
name: nfs
volumes:
- name: nfs
gcePersistentDisk:
pdName: nfs
fsType: ext4
CloudSQL이 안전하고 아름답습니다.
알겠습니다. 정적 데이터에 사용할 실행 NFS가 있습니다.그래서 다음 중요한 단계는 클라우드 SQL을 연결하는 것이다.클라우드 SQL Mysql을 설치했다고 가정하십시오.당신은 어떻게 당신의 콩꼬투리를 그것에 연결합니까?
우리는 용기의 사이드카로 SQL 에이전트를 사용합니다.이렇게 하는 장점은 우리의 MySQL이 공개되지 않아서localhost를 사용할 수 있다는 것이다.너무 좋잖아, 그렇지 않아?
먼저 활성화해야 합니다Cloud SQL Admin API
클라우드 SQL에 실제로 액세스하려면 service account 을 만들어야 합니다.
여기서 우리는 클라우드 SQL > 클라우드 SQL 클라이언트의 권한을 가진 새로운 캐릭터를 만들었습니다
SQL 인스턴스에 액세스하는 데 필요한 개인 키를 다운로드합니다.
현재 데이터베이스 사용자를 만듭니다. 만약 당신이 아직 이렇게 하지 않았다면
gcloud sql users create [DBUSER] --host=% --instance=[INSTANCE_NAME] --password=[PASSWORD]
우리는 실례적인 명칭이 필요하다. 간단하다.gcloud sql instances describe [INSTANCE_NAME]
또는 webinterface에서 찾을 수 있습니다.이제 Kubernetes 인스턴스에 자격 증명을 저장합니다.
kubectl create secret generic cloudsql-instance-credentials \
--from-file=credentials.json=[PROXY_KEY_FILE_PATH]
kubectl create secret generic cloudsql-db-credentials \
--from-literal=username=[DBUSER] --from-literal=password=[PASSWORD]
그럼, 우리는 우리의 Wordpress를 설치할 준비가 되어 있지 않습니까?
먼저 서비스를 만듭니다.
apiVersion: v1
kind: Service
metadata:
name: wlp-service
labels:
app: wlp-service
spec:
type: LoadBalancer
sessionAffinity: ClientIP
ports:
- port: 443
targetPort: 443
name: https
- port: 80
targetPort: 80
name: http
selector:
app: wordpress
자, 이제 우리는 서비스를 시작하고 운행 중이며, 유일하게 부족한 것은 기중기 자체입니다.우리가 그것을 좀 분리하자, 이렇게 하면 내가 설명할 수 있다
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
labels:
app: wordpress
spec:
replicas: 2
strategy:
type: RollingUpdate
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- name: wordpress
image: wordpress:7.3-apache
imagePullPolicy: Always
env:
- name: DB_USER
valueFrom:
secretKeyRef:
name: "cloudsql-db-credentials"
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: "cloudsql-db-credentials"
key: password
ports:
- containerPort: 80
name: wordpress
- containerPort: 443
name: ssl
이것은 wordpress를 실행하기에 충분하지만 데이터베이스나 지속적인 nfs가 없습니다.클라우드 ql 에이전트를 하나씩 추가합니다. - name: cloudsql-proxy
image: gcr.io/cloudsql-docker/gce-proxy:1.11
command: ["/cloud_sql_proxy",
"-instances=[YOUR INSTANCESTRING THAT WE LOOKED UP]=tcp:3306",
"-credential_file=/secrets/cloudsql/credentials.json"]
securityContext:
runAsUser: 2 # non-root user
allowPrivilegeEscalation: false
volumeMounts:
- name: cloudsql-instance-credentials
mountPath: /secrets/cloudsql
readOnly: true
volumes:
- name: cloudsql-instance-credentials
secret:
secretName: cloudsql-instance-credentials
멋지다. 현재 우리는localhost를 사용하여 우리의 클라우드 SQL에 접근할 수 있다:) 이것은 기본적으로pod에 두 번째 용기를 추가합니다. 3306에 제출된 모든 내용을 우리의 클라우드 SQL 실례에 에이전트하고 유량을 공공 네트워크에 노출하지 않습니다.이제 NFS에 wp 컨텐츠 디렉토리를 마운트하려고 합니다.
volumeMounts:
- name: my-pvc-nfs
mountPath: "/var/www/html/wp-content"
volumes:
- name: my-pvc-nfs
nfs:
server: 10.3.240.20
path: "/"
이제 말하기 시작할 거야. 그런데 마리오, 왜 해커가 IP를 고정한 NFS를이유가 있어요.이것은 내가 알고 있는 유일한 내부 dns가 정상적으로 일을 할 수 없는 상황이다.지금 우리는 hpa를 창설하여 우리의 기중기를 확장할 수 있다
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: wordpress
namespace: default
spec:
maxReplicas: 10
metrics:
- resource:
name: cpu
targetAverageUtilization: 50
type: Resource
minReplicas: 3
scaleTargetRef:
apiVersion: extensions/v1beta1
kind: Deployment
name: wordpress
우리의 모든 wp 내용 파일은 nfs에 들어가서 실례 간에 공유됩니다.네, 맞습니다. NFS는 현재 우리의 단일 고장이지만 NFS는 한 대의 기계만 운행하는 것보다 훨씬 안정적입니다.만약redis 같은 캐시를 사용하거나 fpm 캐시를 추가하면 캐시 시간을 더욱 단축할 수 있습니다.멋있지 않아요?
기본적인 Kubernetes/클라우드 로밍에 관심이 있으십니까?알려주세요.
Reference
이 문제에 관하여(Google Cloud에서 Kubernetes 엔진과 클라우드 SQL을 사용하여 Wordpress 등 상태 애플리케이션을 적절히 확장), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/mfahlandt/scaling-properly-a-stateful-app-like-wordpress-with-kubernetes-engine-and-cloud-sql-in-google-cloud-27jh텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)