This use case demonstrates concurrently deploying a domain that is similar to the Update 1 use case domain to the same sample-domain1-ns
namespace, but with a different domain UID, a different WebLogic domain name, and a different WebLogic domain encryption key. It does this by:
sample-domain2
, for the new domain.domain2
, for the different domains.Note that this use case shows Model in Image’s unique ability to quickly deploy a copy of a WebLogic domain that has a different WebLogic domain name and domain encryption key. This is a useful capability that is not supported by the Domain in Image domain home source type:
Domain in Image does not support overriding the domain name, but different domain names are necessary when two domains need to interoperate. This use case takes advantage of model macros to ensure that its two different domains have a different domain name:
@@ENV:CUSTOM_DOMAIN_NAME@@
environment variable macro.CUSTOM_DOMAIN_NAME
environment variable to be different using the env
stanza in each Domain’s YAML file.Domain in Image requires that its images embed a WebLogic security/SerializedSystemIni.dat
domain encryption key that cannot be changed for the image (see Why layering matters in CI/CD considerations). This necessarily means that two Domain in Image domains that share the same image can decrypt each other’s encrypted passwords. On the other hand, a Model in Image’s domain encryption key is not embedded in the image and instead, is dynamically and uniquely created each time the domain is started.
Oracle requires interoperating WebLogic domains to have different domain names. This is necessary when two domains communicate, or when a WebLogic Server or WebLogic Java client concurrently connects to multiple domains.
Here are the steps for this use case:
Make sure you have deployed the domain from the Update 1 use case.
Create a ConfigMap with the WDT model that contains the data source definition.
Run the following commands:
$ kubectl -n sample-domain1-ns create configmap sample-domain2-wdt-config-map \
--from-file=/tmp/mii-sample/model-configmaps/datasource
$ kubectl -n sample-domain1-ns label configmap sample-domain2-wdt-config-map \
weblogic.domainUID=sample-domain2
If you’ve created your own data source file in the Update 1 use case, then substitute the file name in the --from-file=
parameter (we suggested /tmp/mii-sample/mydatasource.yaml
earlier). Note that the -from-file=
parameter can reference a single file, in which case it puts the designated file in the ConfigMap, or it can reference a directory, in which case it populates the ConfigMap with all of the files in the designated directory.
Observations:
sample-domain1-ns
unchanged for the ConfigMap because you will deploy domain sample-domain2
to the same namespace as sample-domain1
.weblogic.domainUID
label as a convenience for finding all resources associated with a domain.Create the secrets that are referenced by the WDT model files in the image and ConfigMap; they also will be referenced by the Domain YAML file.
Run the following commands:
NOTE: Substitute a password of your choice for MY_WEBLOGIC_ADMIN_PASSWORD. This password should contain at least seven letters plus one digit.
NOTE: Substitute a password of your choice for MY_RUNTIME_PASSWORD. It should be unique and different than the admin password, but this is not required.
# spec.webLogicCredentialsSecret
$ kubectl -n sample-domain1-ns create secret generic \
sample-domain2-weblogic-credentials \
--from-literal=username=weblogic --from-literal=password=MY_WEBLOGIC_ADMIN_PASSWORD
$ kubectl -n sample-domain1-ns label secret \
sample-domain2-weblogic-credentials \
weblogic.domainUID=sample-domain2
# spec.configuration.model.runtimeEncryptionSecret
$ kubectl -n sample-domain1-ns create secret generic \
sample-domain2-runtime-encryption-secret \
--from-literal=password=MY_RUNTIME_PASSWORD
$ kubectl -n sample-domain1-ns label secret \
sample-domain2-runtime-encryption-secret \
weblogic.domainUID=sample-domain2
# referenced by spec.configuration.secrets and by the data source model YAML in the ConfigMap
$ kubectl -n sample-domain1-ns create secret generic \
sample-domain2-datasource-secret \
--from-literal='user=sys as sysdba' \
--from-literal='password=incorrect_password' \
--from-literal='max-capacity=1' \
--from-literal='url=jdbc:oracle:thin:@oracle-db.default.svc.cluster.local:1521/devpdb.k8s'
$ kubectl -n sample-domain1-ns label secret \
sample-domain2-datasource-secret \
weblogic.domainUID=sample-domain2
Observations:
sample-domain1-ns
unchanged for each secret because you will deploy domain sample-domain2
to the same namespace as sample-domain1
.weblogic.domainUID
label as a convenience for finding all resources associated with a domain.sample-domain1
in the Update 4 use case.If you’re following the JRF
path through the sample, then you also need to deploy the additional secret referenced by macros in the JRF
model RCUDbInfo
clause, plus an OPSS
wallet password secret. For details about the uses of these secrets, see the Model in Image user documentation. Note that we are using the RCU prefix FMW2
for this domain, because the first domain is already using FMW1
.
Set up a Domain YAML file that is similar to your Update 1 use case Domain YAML file but with a different domain UID, domain name, model update ConfigMap reference, and Secret references:
Option 1: Update a copy of your Domain YAML file from the Update 1 use case.
In the Update 1 use case, we suggested creating a file named /tmp/mii-sample/mii-update1.yaml
or using the /tmp/mii-sample/domain-resources/WLS-AI/mii-update1-d1-WLS-AI-v1-ds.yaml
file that is supplied with the sample.
We suggest copying this Domain YAML file and naming the copy /tmp/mii-sample/mii-update2.yaml
before making any changes.
Working on a copy is not strictly necessary, but it helps keep track of your work for the different use cases in this sample and provides you a backup of your previous work.
Change the /tmp/mii-sample/mii-update2.yaml
Domain YAML file name and weblogic.domainUID
label to sample-domain2
.
The final result will look something like this:
apiVersion: "weblogic.oracle/v9"
kind: Domain
metadata:
name: sample-domain2
namespace: sample-domain1-ns
labels:
weblogic.domainUID: sample-domain2
NOTE: We are leaving the namespace
sample-domain1-ns
unchanged because you will be deploying domainsample-domain2
to the same namespace assample-domain1
.
Change the /tmp/mii-sample/mii-update2.yaml
Domain YAML file’s CUSTOM_DOMAIN_NAME
environment variable from domain1
to domain2
.
The model file in the image uses macro @@ENV:CUSTOM_DOMAIN_NAME@@
to reference this environment variable when setting its domain name.
Specifically, change the corresponding Domain spec.serverPod.env
YAML file stanza to look something like this:
...
spec:
...
serverPod:
...
env:
- name: CUSTOM_DOMAIN_NAME
value: "domain2"
...
Change the /tmp/mii-sample/mii-update2.yaml
Domain YAML file’s spec.domainHome
value to /u01/domains/sample-domain2
. The corresponding YAML file stanza will look something like this:
...
spec:
...
domainHome: /u01/domains/sample-domain2
...
(This change is not strictly needed, but it is a helpful convention to decorate a WebLogic domain’s home directory with its domain name or domain UID.)
Change the /tmp/mii-sample/mii-update2.yaml
secret references in the spec.webLogicCredentialsSecret
and spec.configuration.secrets
stanzas to reference this use case’s secrets. Specifically, change:
spec:
...
webLogicCredentialsSecret:
name: sample-domain1-weblogic-credentials
...
configuration:
...
secrets:
- sample-domain1-datasource-secret
...
model:
...
runtimeEncryptionSecret: sample-domain1-runtime-encryption-secret
To this:
spec:
...
webLogicCredentialsSecret:
name: sample-domain2-weblogic-credentials
...
configuration:
...
secrets:
- sample-domain2-datasource-secret
...
model:
...
runtimeEncryptionSecret: sample-domain2-runtime-encryption-secret
NOTE: If you are following the
JRF
path through the sample, similarly change yourspec.configuration.opss.walletPasswordSecret
and the RCU secret name referenced inspec.configuration.secrets
.
Change the Domain YAML file’s spec.configuration.model.configMap
value from sample-domain1-wdt-config-map
to sample-domain2-wdt-config-map
. The corresponding YAML file stanza will look something like this:
spec:
...
configuration:
...
model:
...
configMap: sample-domain2-wdt-config-map
Now, compare your original and changed Domain YAML files to double check your changes.
$ diff /tmp/mii-sample/mii-update1.yaml /tmp/mii-sample/mii-update2.yaml
9c9
< name: sample-domain1
---
> name: sample-domain2
13c13
< weblogic.domainUID: sample-domain1
---
> weblogic.domainUID: sample-domain2
21c21
< domainHome: /u01/domains/sample-domain1
---
> domainHome: /u01/domains/sample-domain2
36c36
< name: sample-domain1-weblogic-credentials
---
> name: sample-domain2-weblogic-credentials
46c46
< #logHome: /shared/logs/sample-domain1
---
> #logHome: /shared/logs/sample-domain2
61c61
< value: "domain1"
---
> value: "domain2"
71c71
< # claimName: sample-domain1-weblogic-sample-pvc
---
> # claimName: sample-domain2-weblogic-sample-pvc
110c110
< configMap: sample-domain1-wdt-config-map
---
> configMap: sample-domain2-wdt-config-map
113c113
< runtimeEncryptionSecret: sample-domain1-runtime-encryption-secret
---
> runtimeEncryptionSecret: sample-domain2-runtime-encryption-secret
118c118
< - sample-domain1-datasource-secret
---
> - sample-domain2-datasource-secret
NOTE: The diff should not contain a namespace change. You are deploying domain
sample-domain2
to the same namespace assample-domain1
(namespacesample-domain1-ns
).
Apply your changed Domain YAML file:
NOTE: Before you deploy the Domain YAML file, determine if you have Kubernetes cluster worker nodes that are remote to your local machine. If so, you need to put the Domain’s image in a location that these nodes can access and you may also need to modify your Domain YAML file to reference the new location. See Ensuring your Kubernetes cluster can access images.
$ kubectl apply -f /tmp/mii-sample/mii-update2.yaml
Option 2: Use the updated Domain YAML file that is supplied with the sample:
NOTE: Before you deploy the Domain YAML file, determine if you have Kubernetes cluster worker nodes that are remote to your local machine. If so, you need to put the Domain’s image in a location that these nodes can access and you may also need to modify your Domain YAML file to reference the new location. See Ensuring your Kubernetes cluster can access images.
$ kubectl apply -f /tmp/mii-sample/domain-resources/WLS-AI/mii-update2-d2-WLS-AI-v1-ds.yaml
Wait for sample-domain2
to start.
If you run kubectl get pods -n sample-domain1-ns --watch
, then you will see the introspector job for sample-domain2
run and your WebLogic Server pods start. The output will look something like this:
For a more detailed view of this activity,
you can use the waitForDomain.sh
sample lifecycle script.
This script provides useful information about a domain’s pods and
optionally waits for its Completed
status condition to become True
.
A Completed
domain indicates that all of its expected
pods have reached a ready
state
plus their target restartVersion
, introspectVersion
, and image
.
For example:
$ cd /tmp/weblogic-kubernetes-operator/kubernetes/samples/scripts/domain-lifecycle
$ ./waitForDomain.sh -n sample-domain1-ns -d sample-domain2 -p Completed
After the sample-domain2
domain is running, you can call its sample web application to verify that it’s fully active.
Send a web application request to the ingress controller for sample-domain2
:
$ curl -s -S -m 10 -H 'host: sample-domain2-cluster-cluster-1.mii-sample.org' \
http://localhost:30305/myapp_war/index.jsp
Or, if Traefik is unavailable and your domain2
Administration Server pod is running, you can run kubectl exec
:
$ kubectl exec -n sample-domain1-ns sample-domain2-admin-server -- bash -c \
"curl -s -S -m 10 http://sample-domain2-cluster-cluster-1:8001/myapp_war/index.jsp"
You will see something like the following:
<html><body><pre>
*****************************************************************
Hello World! This is version 'v1' of the mii-sample JSP web-app.
Welcome to WebLogic Server 'managed-server1'!
domain UID = 'sample-domain2'
domain name = 'domain2'
Found 1 local cluster runtime:
Cluster 'cluster-1'
Found min threads constraint runtime named 'SampleMinThreads' with configured count: 1
Found max threads constraint runtime named 'SampleMaxThreads' with configured count: 10
Found 1 local data source:
Datasource 'mynewdatasource': State='Running', testPool='Failed'
---TestPool Failure Reason---
NOTE: Ignore 'mynewdatasource' failures until the sample's Update 4 use case.
---
...
... invalid host/username/password
...
-----------------------------
*****************************************************************
</pre></body></html>
A TestPool Failure
is expected because we will demonstrate dynamically correcting the data source attributes for sample-domain1
in Update 4.
If you see an error other than the expected TestPool Failure
, then consult Debugging.
You will not be using the sample-domain2
domain again in this sample; if you wish, you can shut it down now by calling kubectl -n sample-domain1-ns delete domain sample-domain2
.
To remove the resources you have created in the samples, see Cleanup.